C++ const 關鍵字

C++ const 允許指定一個語義約束,編譯器會強制實施這個約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實有某個值保持不變,就應該明確使用const,這樣可以獲得編譯器的幫助。

1.const 修飾成員變量 

#include<iostream>
using namespace std;
int main(){
    int a1=3;   ///non-const data
    const int a2=a1;    ///const data

    int * a3 = &a1;   ///non-const data,non-const pointer
    const int * a4 = &a1;   ///const data,non-const pointer
    int * const a5 = &a1;   ///non-const data,const pointer
    int const * const a6 = &a1;   ///const data,const pointer
    const int * const a7 = &a1;   ///const data,const pointer

    return 0;
}

const修飾指針變量時:

  (1)只有一個const,如果const位於*左側,表示指針所指數據是常量,不能通過解引用修改該數據;指針本身是變量,可以指向其他的內存單元。

  (2)只有一個const,如果const位於*右側,表示指針本身是常量,不能指向其他內存地址;指針所指的數據可以通過解引用修改。

  (3)兩個const,*左右各一個,表示指針和指針所指數據都不能修改。

2.const修飾函數參數

  傳遞過來的參數在函數內不可以改變,與上面修飾變量時的性質一樣。

void testModifyConst(const int _x) {
     _x=5;   ///編譯出錯
}

3.const修飾成員函數

(1)const修飾的成員函數不能修改任何的成員變量(mutable修飾的變量除外)

(2)const成員函數不能調用非onst成員函數,因爲非const成員函數可以會修改成員變量

 

#include <iostream>
using namespace std;
class Point{
    public :
    Point(int _x):x(_x){}

    void testConstFunction(int _x) const{

        ///錯誤,在const成員函數中,不能修改任何類成員變量
        x=_x;

        ///錯誤,const成員函數不能調用非onst成員函數,因爲非const成員函數可以會修改成員變量
        modify_x(_x);
    }

    void modify_x(int _x){
        x=_x;
    }

    int x;
};

 4.const修飾函數返回值

(1)指針傳遞

如果返回const data,non-const pointer,返回值也必須賦給const data,non-const pointer。因爲指針指向的數據是常量不能修改。

const int * mallocA(){  ///const data,non-const pointer
    int *a=new int(2);
    return a;
}

int main()
{
    const int *a = mallocA();
    ///int *b = mallocA();  ///編譯錯誤
    return 0;
}

(2)值傳遞

 如果函數返回值採用“值傳遞方式”,由於函數會把返回值複製到外部臨時的存儲單元中,加const 修飾沒有任何價值。所以,對於值傳遞來說,加const沒有太多意義。

所以:

  不要把函數int GetInt(void) 寫成const int GetInt(void)。
  不要把函數A GetA(void) 寫成const A GetA(void),其中A 爲用戶自定義的數據類型。

 

  在編程中要儘可能多的使用const,這樣可以獲得編譯器的幫助,以便寫出健壯性的代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章