尽可能使用const
(1)const约束指针、迭代器
const char* p = "adc"; //non-const pointer,const data char* const p = "abc"; //const pointer,non-const data const char* const p = "abc";//const pointer,const data const std::vector<T>::iterator it = vec.begin();//(it的类型为 T* const)const pointer std::vector<T>::const_iterator it = vec.begin();//const data
void a(const T b);//保护形参不被修改 void a(const T* b);//const pointer void a(const T& b);//const reference另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性, 且是不可见的,他短时间存在一个局部域中,所以不能使用指针,只有引用的const传递能够捕捉到这个家伙
(3)const约束函数返回
const T fun1();//这个其实无意义,因为参数返回本身就是赋值。 const T* fun2();//调用时 const T *pValue = fun2(); //我们可以把fun2()看作成一个变量,即指针内容不可变。 T* const fun3(); //调用时 T* const pValue = fun2(); //我们可以把fun2()看作成一个变量,即指针本身不可变。 //引用类似
(4)const约束类
(1)const修饰成员变量 const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。 class A { … const int nValue; //成员常量不能被修改 … A(int x): nValue(x) { } ; //只能在初始化列表中赋值 } (2)const修饰成员函数 const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。 class A { … void function()const; //常成员函数, 它不改变对象的成员变量. //也不能调用类中任何非const成员函数。 } 对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。 a. const成员函数不被允许修改它所在对象的任何一个数据成员。 b. const成员函数能够访问对象的const成员,而其他成员函数不可以。 (3)const修饰类对象/对象指针/对象引用 · const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。 · const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。 例如: class AAA { void func1(); void func2() const; } const AAA aObj; aObj.func1(); × aObj.func2(); 正确 const AAA* aObj = new AAA(); aObj-> func1(); × aObj-> func2(); 正确
要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;
在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
形参为指针或者引用时最好使用const,避免形参为常量不能使用
不要轻易的将函数的返回值类型定为const;
除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;
任何不会修改数据成员的函数都应该声明为const 类型。
原文地址:http://blog.csdn.net/hustyangju/article/details/41520575