(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理

1.作用域

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第1张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第2张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第3张图片

 

2.可见性

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第4张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第5张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第6张图片

 

3.对象的生存期

静态生存期

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第7张图片

动态生存期

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第8张图片

举例:

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第9张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第10张图片

说一下我对这个例子的理解吧,首先 i 为全局变量,具有静态生存期。这个很好理解,静态也就是说这个变量生存期和程序运行期相同。然后他是是文件作用域的,它的的可见性是最高的(除非内部申明了同名的变量,类作用域和块作用域都可见(可以修改)这个变量。

  然后明确这个静态局部变量是怎么个意思。a,b为静态局部变量,具有全局寿命,局部可见。静态可以理解了。既然是在函数里面申明的,那么就属于块作用域,也就是局部变量。所以静态说明:全局寿命(生存期和程序运行期相同),局部变量说明:局部可见(作用域只在块内)。

接着是这 c 为局部变量,具有动态生存期,每次进入函数都初始化。这个也好理解,局部变量:只在这个函数块内作用。动态相对于静态,即它的生存期是和着这个函数块的运行期相同的。也就容易理解每次进入函数都初始化了。

main函数里面的 静态局部变量 a 是同一个道理。作用域是在main函数里面,而不是全局的,故不影响other()里的 静态局部变量 a 。

另外应该还有隐藏的一条是静态局部变量第一次进入函数被初始化,如果不给赋值,则自动赋值为0。 所以申明了没赋值,则它的值自动设置为0。

总的来说呢,就是要清楚一个寿命(生存期)和可见性的区别。生存期是静态的(全局寿命)不代表可见性也是全局的。可见性判断就是基于他是文件作用域呢还是类作用域还是块作用域。

 

4.静态数据成员

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第11张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第12张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第13张图片

这一段的话注意静态数据成员类内声明,类外定义和初始化。

 

5.静态成员函数

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第14张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第15张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第16张图片

 

这一段的话注意类外代码使用的是类名加上作用域操作符 Point:: showCount();而不是对象名加上点的形式。

静态成员函数为什么不能使用非静态成员呢,因为他的使用形式是类名而对象名,所以没有确定的对象的非静态成员。

 

6.类的友元

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第17张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第18张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第19张图片

 

为什么要使用友元函数呢。因为对象的private 成员只有对象本身的函数可以调用。使用了友元函数之后,就可以让这个函数来自由操作需要操作的对象的private成员。

 

7.友元类

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第20张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第21张图片

 

这段代码申明了B类是 A的友元类。B类可以访问A类的私有和保护数据。  该例是A类的对象作为B类的一个私有成员。所以在B类的成员函数中可以直接修改 a,然后进而修改a 的私有成员。

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第22张图片

 

8.共享数据的保护

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第23张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第24张图片

 

为什么常对象只能调用他的常成员函数? 因为常对象不能被修改,而这恰恰是常成员函数干的活啊笨蛋

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第25张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第26张图片

 

常引用

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第27张图片

 

常引用一般用在函数参数中,最大的好处是可以传送地址提高效率,却不用担心变量被修改。

常对象的话也要使用常引用

 

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第28张图片

 

8.多文件结构和编译预处理命令

C++程序的一半组织结构

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第29张图片

 

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第30张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第31张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第32张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第33张图片

 

9.外部变量

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第34张图片

 

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第35张图片

 

10.匿名的命名空间

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第36张图片

 

11.标准C++库

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第37张图片

 

12.

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第38张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第39张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第40张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第41张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第42张图片

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第43张图片

 

13.

 

(C++第五章笔记)作用域,可见性,生存期,类的静态成员,友元,const修饰,多文件结构和编译预处理_第44张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C/C++/C#)