const 允许我们指定一个语义约束,使某个值应该保持不变
1、const 修饰 变量,指针,函数,函数返回值等,可以使程序减少错误,或者更容易检测错误:
指针常量:int* const p;//指针地址不可变,指针指向值可变
常量指针:const int* p;//指针指向值不可变,指针地址可变
常量指针常量:const int* const p;//都不可变
const 修饰迭代器:
iterator 相当于 T* const //指针常量
const_iterator 相当于 const T* //常量指针
const 修饰函数返回值:
const int max(int a, int b)
{a > b ? a : b;
}int c = 6;
max(a,b) = c;
//将 c 的值赋给 max(a, b) 是没有意义的,const 防止这种操作的发生
2、const 修饰成员函数
如果两个成员函数只是常量性不同(其他相同)则可以发生重载
const 类对象调用 const 成员函数
non-const 类对象调用普通成员函数
bitwise:
const 成员函数不能改变(除 static)成员变量的值,因为常函数里 this 指针指向的值不可改变。同理,const 对象不可以调用 non-const 函数,因为函数有能力更改成员属性的值。
但是若成员变量是一个指针,仅仅改变指针指向的值却不改变指针地址(地址是 this 指向的值),则不算是 const 函数 ,但能够通过 bitwise 测试。
使用 mutable 可以消除 non-static 成员变量的 bitwise constness 约束。
class person
{
public:person(int a){m_id = a;}int& func() const{m_id = 888;}mutable int m_id;
}; int main()
{const person p(666);p.func();cout << p.m_id << endl;system("pause");return 0;
}
3、当 const 和 non-const 成员函数有实质的等价实现时,利用两次转型,令 non-const 调用 const 可以避免代码重复。
const char& operator[](int pos) const
{//...//...return name[pos];
}char& operator[](int pos)
{returnconst_cast<char&>//移除第一次转型添加的 const(static_cast<const classname>(*this)[pos]//把 classname 类型数据转换为 const classname//使得能够调用 const operator[]);
}
原文链接:https://blog.csdn.net/qq_62674741/article/details/124896986