首页 > 代码库 > effective c++ 条款03 整理

effective c++ 条款03 整理

尽可能使用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

(2)const约束函数形参

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 = http://www.mamicode.com/fun2(); >
一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。原因如下:如果返回值为某个对象为const(const A test = A 实例)或某个对象的引用为const(const A& test = A实例) ,则返回值具有const属性,则返回实例只能访问类A中的公有(保护)数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。

(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(); 正确

 

(5)使用const的一些建议

要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;

要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;

在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;

const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;

形参为指针或者引用时最好使用const,避免形参为常量不能使用

不要轻易的将函数的返回值类型定为const;

除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;

任何不会修改数据成员的函数都应该声明为const 类型。

effective c++ 条款03 整理