看到const關鍵字,可能首先想到的是const常量,const不僅可以修飾常量,還可以修飾函數的參數 函數的返回值,以及成員函數。 (1)const修飾函數參數 1.如果輸入的參數採用“指針傳遞”,那麼加上const可以防止意外的改動該指針,起到保護作用 例如:void func(char *dest_str, const char *src_str) 2.如果輸入參數採用“值傳遞”,由於函數將自動產生臨時變量用於複製該參數,該輸入參數本來就不需要保護所以 不用加const也可以 例如:void func(int x)不用寫成void func(const int x) 3.但是對於非內部的數據類型的參數而言,例如void func( A a)這樣聲明的函數註定效率低,因爲函數體內 將自動產生臨時對象,用於複製該參數a,而臨時變量的構造,拷貝構造,析構都將耗費時間。所以爲了提高效率 可以寫成這樣void func(A &a)用“引用傳遞”就不用產生臨時對象,如果不想改變參數a就寫成 void func(const A &a) (2)const修飾函數返回值 1.以“指針傳遞”方式的函數返回值加上const修飾,那麼該函數的返回值的內容不能被修改 例如:const char *get_string(void) 2.如果函數返回值採用“值傳遞方式”,由於函數會把返回值複製到外部的臨時存儲單元中,所以加上const修飾 沒有意義, 例如:int get_number(void)不用寫成const int get_number(void) 3.但是返回值不是內部數據類型,例如:A get_string(void),這樣會產生一個臨時的對象用來存放返回的數據, 會調用拷貝構造函數,這樣效率會低,所以採用“引用傳遞”A &get_string(void),如果加上const那麼返回值的 內容就不會被改變const A &get_string(void) (3)const修飾成員函數 1.任何不會修改成員的函數都應該聲明爲const類型。 例如計數函數不會對成員進行修改所以int get_count(void)const;注意const成員函數的聲明將const放到 函數的尾部。 2.const成員函數不可以修改對象的數據。 const對象只能訪問const成員函數,非const對象可以任意訪問任意的成員函數。 3.class A{ public: int get_count(int)const; } int get_count(int)const準確的說這個const修飾的是this指向的對象,其實get_count(int)這個函數在 調用方法時會被編譯器改寫成get_count(A *const this, int)const;爲了不允許get_count()這個函數改變 this指向的對象,則用const修飾這個函數,因此this指針的類型變爲const A *const this
const修飾函數參數,返回值,成員函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.