文章目录
意义
利用编译机制防止程序员出错
尤其在函数传参时,你不知道哪天你自己脑残或者其他人维护你代码时不了解情况,把一个没必要修改的值修改了,有可能会出现难以检查的错误。
只读区域效率高、不分配空间
常量通常不会被分配空间,一般保存在符号表中,这样一来效率提高,因为不用读内存,二来节省了空间。
使用
声明
const int a = 10;
必须被初始化
这不废话吗? 前面不初始化,后面又不能赋值,那这个量怎么用啊?
常量与指针
几个指针间的关系
指针常量
本质
这是一个指针,这个指针是一个常量
保护对象
指针与变量之间的指向关系
使用
int a;
int * const p = &a;
常量指针
本质
这也是一个指针,这个指针指向常量
保护对象
指针指向的内容
使用
const int x;
const int *p1 = &x;
int const *p2 = &x;
int y;
const int *p3 = &y;
int const *p4 = &y;
指向常量的指针常量
就是常量指针+指针常量
双重保护:这个指针的指向关系被保护,这个指针指向的内容也被保护
const int x;
const int * const p1 = &x;
int const * const p2 = &x;
int y;
const int * const p3 = &y;
int const * const p4 = &y;
传递过程中修改权限不能放大
常成员函数
使用
class test
{
int n = 8;
public:
void f()const
{
cout << n << endl;
}
};
这里的f()就是一个常量成员函数,加了这个const说明这个函数不能对类里的数据进行修改,只能读取
this指针与常成员函数
thiis指针
- 一个类的数据成员的每个对象都分配的,但是成员函数就不一样了,一个类的成员函数是所有对象公用的(类似静态变量)
- 程序是一路向前走的,通过a.f()调用类里函数时,如果没有什么标记的话,函数是不知道谁调用的它
为了解决这样的一个问题,我们有了this指针,this指针指向对象。函数中的成员变量实际上都是this->成员变量
this指针的数据类型
this指针是一个系统送给我们的A* const类型的指针(A为类)
如果是常成员函数的话,系统送的这个this指针会再加一个限制,变成A const* const类型
所以在常成员函数里不能调用不是const类型的成员函数(涉及到指针权限下放的问题)
这样其实也确保了const函数里不可能修改类的数据成员,做到了绝对的只读
常成员函数的实现机制
其实就是检查指针(this指针的传递,权限不能下放)