Core List
1. const 修饰指针变量
char *name = "Boxi"; //非常量指针,非常量变量
const char* name = "Boxi"; //非常量指针,常量变量
char const* name = "Boxi"; //非常量指针,常量变量(同上1等价)
char* const name = "Boxi"; //常量指针,非常量变量
const char* const name = "Boxi"; //常量指针,常量变量
2. const 修饰迭代器
(1) const vector<int>::iterator it = vec.begin(); //常量指针,非常量变量【T* const】
*iter = 10; //【正确】可以修改指针指向地址内的数据
iter++; //【错误】不可修改指针指向的地址
(2) vector<int>::const_iterator it = vec.begin(); //非常量指针,常量变量【const T*】
*iter = 10; //【错误】不可以修改指针指向地址内的数据
iter++; //【正确】可修改指针指向的地址
3. const 修饰函数
(1) 修饰返回值
const Fun (const int &a, const int& b); // 避免返回值被重新误赋值
(2) 修饰参数
const Fun (const int &a, const int& b); // 避免函数内部修改变量
(3) 修饰成员函数【目的:操作 const 对象】
class Man {
pubilic:
const char& operate[] (unsigned int index) const
{ return text[index]; } // const 对象调用此函数
char& operate[] (unsigned int index)
{ return text[index]; } // 非 const 对象调用此函数
private:
std::string text;
}
例:
const Man cm("Boxi"); //cm为const类型
cout<<cm[0]<<; //【正确】读一个const类型对象
cm[0] = 'x; //【错误】写一个const类型对象
Man m("Boxi"); //m为非const类型
cout<<m[0]<<; //【正确】读一个非const类型对象
m[0] = 'x'; //【正确】写一个const类型对象
注:如果返回的是char 而非 &char,则m[0]='x'不合法,其赋值的是m.text[0]的一个副本【函数返回值是内置对象,则函数返回值不可被修改】
4. bitwise constness 和 logical constness
bitwise constness :不更改对象内的任何一个bit
logical constness :可以修改它锁处理的对象内某些 bit, 但只有在客户端侦测不出的情况。
注:bitwise constness 问题 【满足bitwise constness测试,但值被修改】
对象包含的成员是指针,指针所指向的地址中的变量改变了。
注:取消 bitwise constness 约束 【使用 mutable 修改变量】
5. const 和 non-const 成员函数中避免代码重复
(1) const 内部调用 non-const 【错误】(non-const 可修改对象内部变量,其不能包含在const内部)
(2) non-const 内部调用 const 【正确】(两次类型转换)
const char& operate[] (unsigned int index) {}
char& operate[] (unsigned int index) {
return const_cast<char&>(static_cast<const TextBlock&>(*this) [index])
}
注:
static_cast :将non-const 转化为 const
const_cast :将返回值移除const