程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> effective c++ 條款03 整理

effective c++ 條款03 整理

編輯:C++入門知識

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::iterator it = vec.begin();//(it的類型為 T* const)const pointer
std::vector::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 = fun2(); 
                          //我們可以把fun2()看作成一個變量,即指針內容不可變。
T* const fun3(); //調用時 T* const pValue = fun2(); 
                          //我們可以把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 類型。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved