const修飾函數參數,返回值,成員函數

 看到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 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章