条款3:尽可能地使用const
2015-05-28 10:37
274 查看
如下为const修饰的几种类型:
char name[] = "benxintuzi";
char* p1 = name; // non-const pointer, non-const data
const char* p2 = name; // non-const pointer, const data
char* const p3 = name; // const pointer, non-const data
const char* const p4 = name; // const pointer, const data
小技巧:
如果const出现在*号左边,就是non-const pointer, const data;如果出现在*号右边,就是const pointer, non-const data。
const的另外一个用途就是修饰函数:const可以修饰返回值、参数、函数本身。
现在定义一个类TextBlock操作一个字符串的某个字符:
注意:
上边的重载[]操作符返回的是char&,而不是char,否则name[0] = 'B'这样的语句就不能通过编译。究其原因就是如果返回一个内置类型,那么改变其值是不好的,因此C++不会同样这样做,即使有些编译器可以通过,那么最终你改变的也只是一个副本而已,原始的字符并没有改变(因为如果不返回引用,只是返回类型本身的话,C++会调用复制构造函数返回一个副本而已)。
如果我们可以确定成员函数不会改变对象的任何变量,那么我们就可以将函数声明为const,就是:
但若是我们想在const函数中改变某个特殊成员变量怎么办呢?利用mutable对变量进行修饰即可:
char name[] = "benxintuzi";
char* p1 = name; // non-const pointer, non-const data
const char* p2 = name; // non-const pointer, const data
char* const p3 = name; // const pointer, non-const data
const char* const p4 = name; // const pointer, const data
小技巧:
如果const出现在*号左边,就是non-const pointer, const data;如果出现在*号右边,就是const pointer, non-const data。
const的另外一个用途就是修饰函数:const可以修饰返回值、参数、函数本身。
现在定义一个类TextBlock操作一个字符串的某个字符:
#include<iostream> using namespace std; class TextBlock { public: TextBlock(string text) { this->text = text; } const char& operator[](size_t position) const // 操作常量对象 { return text[position]; } char& operator[](size_t position) // 操作非常量对象 { return text[position]; } private: string text; }; int main() { TextBlock name("benxintuzi"); cout << name[0]; // 调用non-const类型的operator[] name[0] = 'B'; // 正确 const TextBlock cname("tuzi"); cout << cname[0]; // 调用const类型的operator[] cname[0] = 'T'; // 错误 return 0; }
注意:
上边的重载[]操作符返回的是char&,而不是char,否则name[0] = 'B'这样的语句就不能通过编译。究其原因就是如果返回一个内置类型,那么改变其值是不好的,因此C++不会同样这样做,即使有些编译器可以通过,那么最终你改变的也只是一个副本而已,原始的字符并没有改变(因为如果不返回引用,只是返回类型本身的话,C++会调用复制构造函数返回一个副本而已)。
如果我们可以确定成员函数不会改变对象的任何变量,那么我们就可以将函数声明为const,就是:
#include<iostream> using namespace std; class TextBlock { public: size_t stat() const; private: int length; bool use; }; size_t TextBlock::stat() const // const函数表示不会改变对象中的所有变量 { use = true; 17 length = 10; return length; } int main() { TextBlock tb; cout << tb.stat() << endl; // assignment of member ‘TextBlock::use’ in read-only object ... return 0; }
但若是我们想在const函数中改变某个特殊成员变量怎么办呢?利用mutable对变量进行修饰即可:
class TextBlock { public: size_t stat() const; // const函数表示不会改变对象中的所有变量 private: mutable int length; mutable bool use; };
相关文章推荐
- 条款3:尽可能使用const
- 条款3:尽可能使用const
- Effective C++ 条款三 尽可能使用const
- Effective C++学习3 条款03:尽可能使用const
- Effective C++学习笔记——条款03:尽可能使用const
- effective c++:条款21: 尽可能使用const
- 【Effective C++】条款03-尽可能使用const
- 条款03:尽可能使用const(Use const whenever possible.)
- 《Effect C++》学习------条款03:尽可能使用const
- 条款03:尽可能的使用const
- 《Effective C++》学习笔记条款03 尽可能使用const
- 条款03:尽可能使用const
- 条款03:尽可能使用const
- 条款02:尽可能使用const, enum, inline替代define
- Effective C++:条款03:尽可能使用const
- 条款03:尽可能的使用const
- effective c++ 条款21: 尽可能使用const
- effective C++笔记之条款20、21:避免public接口出现数据成员、尽可能使用const
- Effective C++读书笔记 条款03:尽可能使用const
- effective c++条款21: 尽可能使用const