文章目录
const修饰的成员和对象
const修饰成员变量
此时和const修饰普通变量一样
只改变了成员变量的属性【从可读可写–>只读】,即const修饰哪个成员变量那个成员变量就的值就不能再被修改了
例
被const修饰的成员变量只能在成员初始化列表中赋初值
因被为const修饰后就该成员变量就具有了常属性,就跟常量一样不能
被赋值
改变,所以const修饰的变量只能在定义初始化的时候获得初始值,之后就改变不了了
而成员初始化列表【不了解的可以看我这篇文章:类和对象【二】this指针,构造函数和成员初始化列表【超详细】】
就是对象中存储的
成员变量定义和初始化的地方
例
const修饰成员函数
-
const要放在成员函数
声明和定义
的()后面 -
const修饰成员函数时,其实修饰的是
*this
,即此时成员函数中的this指针的类型是
const A(类名)* const this
-
const修饰的成员函数中不能对当前类的任意成员变量(除了静态成员变量【因为静态成员变量
没有
存储在对象中】)进行修改,但是可以访问
因为2中提到的const修饰成员函数时其实修饰的是*this
,所以不能
通过this的解引用去修改this指向的对象中存储的数据了,也就是this可以指向的非静态成员变量不能被修改了
例
4.在类中的成员变量声明时加上mutable
,就可以
让它在const修饰的函数中也可以修改
例
const修饰对象
-
const修饰的对象中存储的数据就不能被修改了,也就是
存储在对象中的任意一个成员变量
都不能被修改[static修饰的成员变量可以被修改,因为static修饰的成员变量不存储
在对象中] -
const修饰的对象
只能
调用const修饰的成员函数
因为const修饰了对象之后,要保证在任何时候对象中的数据都不能修改
所以对象调用成员函数时,在成员函数中也不能改变对象中的数据,只有
const修饰的成员函数可以保证这一点
static修饰成员和对象
static修饰成员变量
-
static修饰的成员变量在一个类中
只有一份
,且它不存储在任何一个对象中
任何一个对象都可以访问他,但访问到的都是同一个同一片内存的数据成员
[所以如果有一个修改了static修饰数据成员,那么其他的对象去访问的时候,访问到的是被修改之后的static修饰数据成员]
例
-
static修饰的成员变量是存放在
全局区
的,而且它的生命周期也和全局变量一样长 -
static修饰数据成员
只在类里声明
,定义和初始化在全局中
因为static修饰的变量必须初始化,而成员变量初始化只能在成员初始化列表中初始化
但是它没有存储在对象里,所以它不能用
成员初始化列表初始化
而且它要存储在全局区 -
static修饰数据成员,可以用类名+::访问
例
-
static修饰的成员变量
不能
在类里给缺省值
因为缺省值是传给成员初始化列表的
而成员初始化列表只能定义和初始化对象里存的成员
static修饰成员函数的特点
-
static修饰成员函数,可以用类名+::的方式调用
例
-
static修饰成员函数中不能有不是静态成员的成员
例
[因为static修饰的成员变量和成员函数的生命周期,比普通类的成员的生命周期更长,这样就可能会出现调用static修饰成员函数时,普通的类的成员没有初始化/这个成员已经被销毁的现象,所以直接禁止了] -
static修饰成员函数中
没有this指针
[因为static修饰的成员变量和成员函数的的生命周期比普通的对象的生命周期都长
,就有可能出现,调用static修饰成员函数时,对象还没有创建/已经销毁的情况,因为this指针指向调用成员函数的对象的,如果这个对象对象还没有创建/已经销毁,那this就是野指针了]
static修饰的对象
-
static修饰的对象的生命周期和全局变量一样长
-
局部域中的static修饰的对象创建是代码执行到的时候才创建,而不是和全局域中的一样在main函数调用之前就创建了