【C++】一键学会const成员&&explicit关键字&&static 成员

目录

一、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)特性


【C++】一键学会const成员&&explicit关键字&&static 成员_第1张图片

一、const成员

1、定义

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

2、特性 

1)const 修饰 this 指针

【C++】一键学会const成员&&explicit关键字&&static 成员_第2张图片

【C++】一键学会const成员&&explicit关键字&&static 成员_第3张图片❓为什么加了const之后运行失败呢?

 ✅【答案】因为出现了权限放大的问题。aa参数的类型是const A* ,但是成员函数Print()的参数类型是A*。隐含的参数this是不能修改类型的,该成员函数中不能对类的任何成员进行修改。所以在成员函数的后面加上const。

【C++】一键学会const成员&&explicit关键字&&static 成员_第4张图片

【C++】一键学会const成员&&explicit关键字&&static 成员_第5张图片2)修饰全局函数参数

间接 const 对象:把对象传给函数,为了减少拷贝传引用,为了保证不改变数据加 const 。

【C++】一键学会const成员&&explicit关键字&&static 成员_第6张图片

3)修饰不改变成员变量的成员函数

内部不改变成员变量的成员函数,最好加上const,const对象和普通对象都可以调用。 因此,之前写过的日期类有些函数可以加上 const ,声明和定义都需要加。 【C++】一键学会const成员&&explicit关键字&&static 成员_第7张图片

3、思考

❓ const对象可以调用非const成员函数吗?

✅【答案】不能,const对象权限小,非const成员函数权限大。

❓ 非const对象可以调用const成员函数吗?

✅【答案】可以,非const对象权限大,const成员函数权限小。

❓ const成员函数内可以调用其它的非const成员函数吗?

✅【答案】不能,cosnt成员函数权限小,其他非const成员函数权限大

❓非const成员函数内可以调用其它的const成员函数吗?

✅【答案】能,非const成员函数权限大,其他const成员函数权限小。

总结:const 本质上是缩小成员函数权限。

二、.取地址及const取地址操作符重载

1、默认生成

这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

1)无 const 

【C++】一键学会const成员&&explicit关键字&&static 成员_第8张图片

2)const 成员

【C++】一键学会const成员&&explicit关键字&&static 成员_第9张图片

2、重载 

1)无 const

【C++】一键学会const成员&&explicit关键字&&static 成员_第10张图片

2)const 成员

【C++】一键学会const成员&&explicit关键字&&static 成员_第11张图片这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想让别人获取到指定的内容! 

三、explicit关键字

1、引入

1)单参数的隐式类型转换

①隐式类型转换的基本形式

【C++】一键学会const成员&&explicit关键字&&static 成员_第12张图片

隐式转化会形成一个临时变量。再将临时变量拷贝给目标对象。 

 【C++】一键学会const成员&&explicit关键字&&static 成员_第13张图片

②隐式类型转换的优化 

 那为什么我们运行起来没有显示调用拷贝构造函数呢?

【C++】一键学会const成员&&explicit关键字&&static 成员_第14张图片

✅ 【答案】编译器会进行优化:构造+拷贝+优化->构造,所以运行起来只显示构造函数。

③临时变量具有常性

❓为什么引用加上const就可以初始化成功呢?

【C++】一键学会const成员&&explicit关键字&&static 成员_第15张图片【C++】一键学会const成员&&explicit关键字&&static 成员_第16张图片

✅【答案】临时变量具有常性。没加const之前,右边的整数调用构造函数,构造出一个A类型的临时变量,但临时变量具有常性,相较于左侧的A的引用缩小了权限,左右两侧权限不匹配;加了const之后,左边数据类型缩小,类型权限匹配。

2)多参数的隐式类型转化

多参数的隐式类型转换与单参数的隐式类型转换相似。

【C++】一键学会const成员&&explicit关键字&&static 成员_第17张图片

2、explicit 

如果不想在调用构造函数时构造出一个临时变量的话,就可以用关键字explicit。用explicit修饰构造函数,将会禁止构造函数的隐式转换。

【C++】一键学会const成员&&explicit关键字&&static 成员_第18张图片

四、static 成员

1、引入

当我们想计算一个类中创建了多少个类对象,定义一个全局变量count;

【C++】一键学会const成员&&explicit关键字&&static 成员_第19张图片【C++】一键学会const成员&&explicit关键字&&static 成员_第20张图片

但是作为全局变量有一个很大的弊端,就是谁都可以修改。我们当然不希望谁都可以修改我们的变量,因此我们希望可以把count 放进类里面去,但是这样自己也变成了一个类对象,要想统计一共有多少个类对象,count 就不能属于某一个对象。C++为此设计了static 成员变量。

2、static

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用 static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。

 ❓静态成员可以设置缺省值来初始化吗?

✅【答案】不行,因为缺省值是为初始化列表提供的,初始化列表是定义每个成员的,而静态成员变量不属于某个对象,属于所有对象,属于整个类。因此规定静态成员变量一定要在类外进行初始化。

1)static 基本格式

【C++】一键学会const成员&&explicit关键字&&static 成员_第21张图片

2)读取 static 静态成员变量

 ①若静态成员变量是公有的,直接解引用。

【C++】一键学会const成员&&explicit关键字&&static 成员_第22张图片

② 若静态成员变量是私有的,可以定义一个成员函数获取count。

【C++】一键学会const成员&&explicit关键字&&static 成员_第23张图片

③如果main函数中没有定义对象求count,可以定义一个对象引用Getcount,然后减1;也可以使用静态成员函数。

静态成员函数没有this指针

【C++】一键学会const成员&&explicit关键字&&static 成员_第24张图片 【C++】一键学会const成员&&explicit关键字&&static 成员_第25张图片

3)特性

⭕静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区

⭕ 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明

⭕ 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问

⭕静态成员函数没有隐藏的this指针,不能访问任何非静态成员

⭕ 静态成员也是类的成员,受public、protected、private 访问限定符的限制 

静态成员函数可以调用非静态成员函数吗?

✅【答案】不行,因为静态成员函数没有this指针,属于类而不属于类对象。非静态成员函数有this指针,指向类对象。调用静态成员函数时,并不知道其中的非静态成员 从哪来,属于哪个对象,甚至可能都不存在。因此静态成员函数无法访问自己类的非静态成员。

非静态成员函数可以调用类的静态成员函数吗? 

✅【答案】可以,非static成员函数拥有对类成员的访问权限,因此可以访问。

你可能感兴趣的:(C++,c++,开发语言)