C++数据的共享和保护
1、函数原型作用域:C++中最小的作用域
①在函数原型声明时,形参的作用范围就是函数原型作用域。
2、局部作用域/块作用域

3、类作用域
类可以被看做是一组有名成员的集合,类X的成员m具有类作用域,对m的访问方式有如下三种:
①如果在X的成员函数中,没有声明同名的局部作用域标识符,那么在该函数内可以直接访问成员m
②通过表达式X.m或X::m(访问静态成员变量)访问。
③通过ptr→m这样的表达式,ptr为指向X类的一个对象的指针
对象的成员函数具有类作用域
4、文件作用域
eg:全局变量

5、限定作用域的enum枚举类
定义限定作用域的枚举类型的方式是enum class{...},即多了class或struct限定符,此时枚举元素的名字遵循类作用域,在枚举类型的作用域外是不可访问的。相反,在不限定作用域的枚举类型中,枚举元素的作用域与枚举类型本身的作用域相同。

6、可见性
①如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见。
7、对象的生存期
①静态生存期
- 如果对象的生存期与程序的运行期相同,我们称它具有静态生存期。
- 使用static可以在函数内部的局部作用域中声明具有静态生存期的对象
- 局部作用域中静态变量的特点:当一个函数返回后,下一次再调用时,该变量还会保持上一回的值,即使发生了递归调用,也不会为该变量建立新的副本,该变量会在各次调用间共享。
- 定义静态变量的同时可以为它赋初值,只有第一次调用时赋值语句才生效。
- 定义时未指定初值的基本类型静态生存期变量,会被以0值初始化
②动态生存期
8、静态数据成员
static的作用域为类
①static关键字可以实现同一类的不同对象之间的数据共享,静态数据成员具有静态生存期
②由于静态数据成员不属于任何一个对象,因此可以通过类名对它进行访问,一般的用法是“类名::标识符”
③在类的定义中仅仅对静态数据成员进行引用性声明,必须在文件作用域的某个地方使用类名限定进行定义性声明,这时也可以进行初始化
④C++11标准支持常量表达式类型修饰(constexpr,const)的静态常量在类内初始化,此时仍可在类外定义该静态成员,但不能做再次初始化操作。
【注】之所以类的静态数据成员需要在类定义之外再加以定义,是因为需要以这种方式专门为它们分配空间。非静态数据成员无须以此方式定义,因为它们的空间是与它们所属对象的空间同时分配的。
9、静态函数成员
①在静态函数成员中访问类的非静态成员需要指明对象,因为对静态成员函数的调用是没有目的对象的

10、传对象参数时,习惯传引用,传引用可以降低开销
11、友元:提供不同类或对象之间的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制
①从一定程度上讲,友元是对数据隐蔽和封装的破坏
②在一个类中,可以利用关键字friend将其他函数或类声明为友元。
③三点友元声明
- 友元关系是不能传递的
- 友元关系是单向的
- 友元关系是不能被继承的。(理解:别人信任你,不见得信任你的孩子)
12、友元函数:在类中用friend修饰的非成员函数
①虽然友元函数不是本类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员。

②友元函数不能通过对象调用【因为友元函数不是类的成员函数,不属于该类】
③友元函数必须在参数表中显示地指明要访问的对象,而成员函数则在它的对象上操作
13、友元类
①若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。
14、常对象
①常对象的数据成员的值在对象的整个生存期内不能被改变。
②常对象必须进行初始化,而且不能被更新。

15、用const修饰的类成员
①常成员函数:使用const修饰的函数为常成员函数,常成员函数声明的格式如下:

【注1】const是函数类型的一个组成部分,因此在函数的定义部分也要带const关键字
【注2】如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数
【注3】无论是否通过常对象调用常成员函数,在常成员函数调用期间,目的对象都被视为常对象,因此常成员函数不能更新目的对象的数据成员,也不能针对目的对象调用该类中没有用const修饰的成员函数
【注4】const关键字可以用于对重载函数的区分

如果仅以const关键字区分对成员函数的重载,那么通过非const的对象调用该函数,两个重载的函数都可以与之匹配,这时编译器将选择最近的函数——不带const关键字的函数

②常数据成员
- 构造函数对常数据成员进行初始化,只能通过初始化列表
- 类成员中的常静态变量和常量都应当在类体之外加以定义,C++中规定:类的静态常量如果具有整数类型或枚举类型,那么可以直接在类定义中为它指定常量值

16、常引用
①如果在声明引用时用const修饰,被声明的引用就是常引用。常引用所引用的对象不能被更新。常引用的声明形式如下:

②非const的引用只能绑定到普通的对象,而不能绑定到常对象,但常引用可以绑定到常对象
③一个常引用,无论绑定到一个普通对象,还是常对象,通过该引用访问该对象时,都只能把该对象当作常对象。
17、多文件结构和编译预处理命令
①通常一个项目至少划分为3个文件:类定义文件(.h文件)、类实现文件(.cpp文件)、类使用文件(*.cpp,注函数文件)
18、静态函数成员的访问

C++数据的共享和保护的更多相关文章
- 我的C++笔记(数据的共享与保护)
*数据的共享与保护: * .作用域: * 作用域是一个标识符在程序正文中有效的区域.C++中标识符的作用域有函数原型作用域.局部作用域(块作用域).类作用域和命名空间作用域. * ().函数原型作用域 ...
- C/C++基础知识总结——数据的共享与保护
1. 标识符的作用域与可见性 1.1 作用域 标识符的作用域包括:函数原型作用域.局部作用域.类作用域.命名空间作用域 (1) 函数原型作用域:函数的参与的作用域就是从函数的开始到结束 (2) 局部作 ...
- 清华大学《C++语言程序设计基础》线上课程笔记03---数据的共享和保护&数组
数据的共享和保护 对象的生存期 static类型的局部变量,生存期在整个程序,局部可见. void example() { static a=1; int b=2 } 当调用完example函数后,b ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(33)-数据验证共享
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(33)-数据验证共享 注:本节阅读需要有MVC 自定义验证的基础,否则比较吃力 一直以来表单的验证都是不可 ...
- ie页面数据导入共享版
为了解决自动输入号码的正确率,原来的版本一直采用鼠标检测的方法.但是这个方法在其他ie平台的使用不太方便.于是直接检测ie的方法.现在的这个版本完全不需要鼠标的检测.方便而且快速精准可靠. 经过作者的 ...
- java 使用volatile实现线程数据的共享
java 使用volatile实现线程数据的共享 直接上代码看效果: public class VolatileTest extends Thread { private volatile boole ...
- 频繁的或者大范围的来实现数据的共享要使用Vuex
一. Vuex 概述 1.1 组件之间共享数据的方式 由于使用频繁,通常将v-bind:属性名=" "的格式简写成:属性名=" ".兄弟组件之间的共享即不相干组 ...
- EF Core利用Transaction对数据进行回滚保护
What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用于数据库,如果事务回滚,则没有任何操作应 ...
- Python多进程-进程间数据的共享
不同的进程不能同时修改一份数据,但是不同的进程能对一份数据进行修改 可通过Manager来实现进程间的数据共享 # -*- coding:utf-8 -*- __author__ = "Mu ...
- 大数据freestyle: 共享单车轨迹数据助力城市合理规划自行车道
编者按:近年来,异军突起的共享单车极大地解决了人们共同面临的“最后一公里”难题,然而,共享单车发展迅猛,自行车道建设却始终没有能够跟上脚步.幸运的是摩拜单车大量的轨迹数据为我们提供了一种新的思路:利用 ...
随机推荐
- Kotlin:【数字类型】安全转换函数
- Hat靶机
Hat靶机的ip是192.168.200.8 先用nmap扫描一下靶机所有的端口 nmap -p- 192.168.200.8 发现22端口不知道是否开放 还有一个65535 的unkown端口 详细 ...
- LeetCode刷题:runtime error: reference binding to null pointer of type 'int' (stl_vector.h)报错请教
题目:https://leetcode.cn/problems/merge-intervals/ 错误代码: // 思路初探:做了很多道类似区间操作的题目了.本题就是尽可能少的创建新区间 // 1.首 ...
- OSI七层经典模型架构以及网络的基本概念
在大.中型网络中,通常通过模块化方式将网络功能结构进行分解.但是在各个模块内部,还是存在结构的扩展和弹性问题. 譬如一个园区网络需要接入大量用户等,这个问题一般通过网络的层次化来解决. 传统的网络采用 ...
- Goh:一款Go语言的预编译快速模板引擎。(Benchmark排名第一)
https://github.com/OblivionOcean/Goh Goh 是一款Go语言的预编译快速模板引擎. English | 简体中文 目录 特性 性能测试 安装 使用 语法 特性 预编 ...
- [记录点滴] luaxml编译过程
[记录点滴] luaxml编译 记录一次luaxml编译的解决过程 参考 http://blog.csdn.net/dc_show/article/details/38957991 0x01 编译错误 ...
- 『Python底层原理』--CPython如何运行Python代码
Python作为一种广泛使用的编程语言,其简洁的语法和强大的功能深受开发者喜爱. 然而,对于许多Python用户来说,CPython(Python的官方实现)的内部工作机制仍然是一个神秘的黑盒. 今天 ...
- Typora+PicGo+Gitee图床
Typora+PicGo+Gitee图床 介绍 Typora:一个用于写文章的Markdown 编辑器,Typora 没有采用源代码和预览双栏显示的方式,而是采用所见即所得的编辑方式,实现了即时预览的 ...
- kubernetes 集群中部署 nginx 服务
kubernetes 部署nginx服务 本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问. Namespace Namespace是kubernetes系统中 ...
- Hive - [06] 行转列,列转行
行转列(多行转一行) 1.创建表,并插入示例数据. create table students_info( `SNO` string comment '学生编号', `name` string com ...