C++ this指针、静态成员、封闭类

this指针

指示函数或变量作用于当前对象

例如:

alt

在这里,main函数第二句,先改变c1中的real值,再赋值给c2

作用

C++在编译时会“翻译”成C语言,如类 --> 结构,但结构中不能有函数,故成员函数只能变成全局函数,但是怎么表示作用于哪个对象呢?

解决办法:成员函数“翻译”成全局函数时,会增加一个参数(结构指针),这样在函数访问成员变量时,可以通过结构指针指向的地址来访问。

  • 若成员函数中没有访问成员变量,即使定义对象指针为空,也能调用成员函数
  • 若访问成员变量,则会类似翻译成“this -> a”,显然当this为空时会报错

静态成员

加“static”关键字

作用

将与类有关的全局变量“封装”到类中,便于理解,本质上是全局变量(函数)

区别

  • 不具体作用于某个对象,而是被所有对象共享

  • 即使没有该类的对象存在,静态成员也存在。所以要在定义类的文件中对静态成员进行声明或初始化

  • 静态成员函数无法直接访问非静态成员(因为不知道属于哪个对象,但是可以通过对象名间接的访问),而类的任何成员函数都可以访问类的静态数据成员

  • 注意要自己定义构造、复制构造、析构函数(自动生成的函数不会修改静态成员变量的值),可以结合复制构造函数和析构函数的调用来理解

封闭类

成员对象

以其他类的对象为成员

构造函数要给出初始化列表

默认的构造函数不懂得如何初始化成员对象

构造、析构函数调用顺序

先执行成员对象的构造函数(因为封闭类中可能会调用),再执行封闭类的构造函数

析构函数则相反

复制构造函数

alt

常量对象、常量成员函数

常量对象

在对象定义前加const关键字,则其值不能被改变

常量成员函数

void Get() const;

在成员函数说明后加const。在执行期间不能修改其作用的对象,静态成员除外(静态成员不属于任何对象)

常量成员函数的重载

加了const的成员函数,算是重载而不是重复定义

alt

返回结果:1,2

常量对象上不能执行非常量函数,objTest1只能执行常量函数

常引用

不能通过该引用修改引用对象的值

程序设计与算法(三)C++面向对象程序设计 https://www.bilibili.com/video/BV1Ns411n7ui?p=11