C++ this指针、静态成员、封闭类
this指针
指示函数或变量作用于当前对象
例如:
在这里,main函数第二句,先改变c1中的real值,再赋值给c2
作用
C++在编译时会“翻译”成C语言,如类 --> 结构,但结构中不能有函数,故成员函数只能变成全局函数,但是怎么表示作用于哪个对象呢?
解决办法:成员函数“翻译”成全局函数时,会增加一个参数(结构指针),这样在函数访问成员变量时,可以通过结构指针指向的地址来访问。
- 若成员函数中没有访问成员变量,即使定义对象指针为空,也能调用成员函数
- 若访问成员变量,则会类似翻译成“this -> a”,显然当this为空时会报错
静态成员
加“static”关键字
作用
将与类有关的全局变量“封装”到类中,便于理解,本质上是全局变量(函数)
区别
-
不具体作用于某个对象,而是被所有对象共享
-
即使没有该类的对象存在,静态成员也存在。所以要在定义类的文件中对静态成员进行声明或初始化。
-
静态成员函数无法直接访问非静态成员(因为不知道属于哪个对象,但是可以通过对象名间接的访问),而类的任何成员函数都可以访问类的静态数据成员
-
注意要自己定义构造、复制构造、析构函数(自动生成的函数不会修改静态成员变量的值),可以结合复制构造函数和析构函数的调用来理解
封闭类
成员对象
以其他类的对象为成员
构造函数要给出初始化列表
默认的构造函数不懂得如何初始化成员对象
构造、析构函数调用顺序
先执行成员对象的构造函数(因为封闭类中可能会调用),再执行封闭类的构造函数
析构函数则相反
复制构造函数
常量对象、常量成员函数
常量对象
在对象定义前加const关键字,则其值不能被改变
常量成员函数
void Get() const;
在成员函数说明后加const。在执行期间不能修改其作用的对象,静态成员除外(静态成员不属于任何对象)
常量成员函数的重载
加了const的成员函数,算是重载而不是重复定义
返回结果:1,2
常量对象上不能执行非常量函数,objTest1只能执行常量函数
常引用
不能通过该引用修改引用对象的值
程序设计与算法(三)C++面向对象程序设计 https://www.bilibili.com/video/BV1Ns411n7ui?p=11