目录
一、const成员
1、定义
2、特性
1)const 修饰 this 指针
2)修饰全局函数参数
3)修饰不改变成员变量的成员函数
3、思考
二、.取地址及const取地址操作符重载
1、默认生成
1)无 const
2)const 成员
2、重载
1)无 const
2)const 成员
三、explicit关键字
1、引入
1)单参数的隐式类型转换
①隐式类型转换的基本形式
②隐式类型转换的优化
③临时变量具有常性
2)多参数的隐式类型转化
2、explicit
四、static 成员
1、引入
2、static
1)static 基本格式
2)读取 static 静态成员变量
3)特性
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
✅【答案】因为出现了权限放大的问题。aa参数的类型是const A* ,但是成员函数Print()的参数类型是A*。隐含的参数this是不能修改类型的,该成员函数中不能对类的任何成员进行修改。所以在成员函数的后面加上const。
间接 const 对象:把对象传给函数,为了减少拷贝传引用,为了保证不改变数据加 const 。
内部不改变成员变量的成员函数,最好加上const,const对象和普通对象都可以调用。 因此,之前写过的日期类有些函数可以加上 const ,声明和定义都需要加。
❓ const对象可以调用非const成员函数吗?
✅【答案】不能,const对象权限小,非const成员函数权限大。
❓ 非const对象可以调用const成员函数吗?
✅【答案】可以,非const对象权限大,const成员函数权限小。
❓ const成员函数内可以调用其它的非const成员函数吗?
✅【答案】不能,cosnt成员函数权限小,其他非const成员函数权限大
❓非const成员函数内可以调用其它的const成员函数吗?
✅【答案】能,非const成员函数权限大,其他const成员函数权限小。
总结:const 本质上是缩小成员函数权限。
这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想让别人获取到指定的内容!
隐式转化会形成一个临时变量。再将临时变量拷贝给目标对象。
❓ 那为什么我们运行起来没有显示调用拷贝构造函数呢?
✅ 【答案】编译器会进行优化:构造+拷贝+优化->构造,所以运行起来只显示构造函数。
❓为什么引用加上const就可以初始化成功呢?
✅【答案】临时变量具有常性。没加const之前,右边的整数调用构造函数,构造出一个A类型的临时变量,但临时变量具有常性,相较于左侧的A的引用缩小了权限,左右两侧权限不匹配;加了const之后,左边数据类型缩小,类型权限匹配。
多参数的隐式类型转换与单参数的隐式类型转换相似。
如果不想在调用构造函数时构造出一个临时变量的话,就可以用关键字explicit。用explicit修饰构造函数,将会禁止构造函数的隐式转换。
当我们想计算一个类中创建了多少个类对象,定义一个全局变量count;
但是作为全局变量有一个很大的弊端,就是谁都可以修改。我们当然不希望谁都可以修改我们的变量,因此我们希望可以把count 放进类里面去,但是这样自己也变成了一个类对象,要想统计一共有多少个类对象,count 就不能属于某一个对象。C++为此设计了static 成员变量。
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用 static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。
❓静态成员可以设置缺省值来初始化吗?
✅【答案】不行,因为缺省值是为初始化列表提供的,初始化列表是定义每个成员的,而静态成员变量不属于某个对象,属于所有对象,属于整个类。因此规定静态成员变量一定要在类外进行初始化。
①若静态成员变量是公有的,直接解引用。
② 若静态成员变量是私有的,可以定义一个成员函数获取count。
③如果main函数中没有定义对象求count,可以定义一个对象引用Getcount,然后减1;也可以使用静态成员函数。
静态成员函数没有this指针。
⭕静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
⭕ 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
⭕ 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
⭕静态成员函数没有隐藏的this指针,不能访问任何非静态成员
⭕ 静态成员也是类的成员,受public、protected、private 访问限定符的限制
❓静态成员函数可以调用非静态成员函数吗?
✅【答案】不行,因为静态成员函数没有this指针,属于类而不属于类对象。非静态成员函数有this指针,指向类对象。调用静态成员函数时,并不知道其中的非静态成员 从哪来,属于哪个对象,甚至可能都不存在。因此静态成员函数无法访问自己类的非静态成员。
❓非静态成员函数可以调用类的静态成员函数吗?
✅【答案】可以,非static成员函数拥有对类成员的访问权限,因此可以访问。