C++中const小結

bruce628發表於2024-03-22

const 修飾普通變數

表示變數的值不能被改變。下面兩條語句(第2行和第3行)表示的意思一致。

int a;
const int ca = 42;
//int const ca = 42;

const 修飾指標

指向常量的指標不能改變其指物件的值。第 5 行程式碼是錯誤的。

int a = 42;

const int * ip = &a;
int const * ipp = &a;
//*ip = 42;

常量指標不能改變其指向,也就意味著它必須要初始化。但是,可以透過常量指標改變其所指物件的值,如第 6 行程式碼,最終列印結果會是 56

int a = 42;
int b = 25;

int * const p = &a;
//p = &b;
*p = 56;
cout << "a: " << a << endl;

常量指標,同時它指向一個常量

const int a = 42;
const int * const p = &a;

const 與引用

臨時物件的常引用。第2行程式碼會報錯,不能將double型別引用繫結到int型別變數上。但是,加了const修飾後,就沒有問題了。

int a = 42;
//double &f = a;
const double &f = a;

本質上,const引用,引用了一個不可改變的臨時變數。編譯器把程式碼處理成了如下形式

	const double temp = a;
    const double &f = temp;

const 修飾函式引數

如果第1行程式碼引數中沒有const,則會報錯,不能將一個非const左值引用型別繫結到一個右值(臨時物件)上。故將引數修改為常引用

void foo(const std::string &str)
{
    cout << str << endl;
}

int main()
{
    foo("abcd");

    return 0;
}

const 修飾類資料成員

const修飾資料成員,稱為常資料成員,可能被普通成員函式和常成員函式來使用,不可以更改。

必須初始化,可以在類中(不推薦),或者初始化列表中(這是在類物件生成之前唯一一次改變const成員的機會了)。

class A
{
public:
    A(int i)
        :_ci(i)
    {
        cout << "A(int i)" << endl;
    }

    ~A()
    {
        cout << "~A()" << endl;
    }

    void dis()
    {
        cout << _ci << endl;
    }
private:
    //const int _ci = 100;  // 不推薦
    const int _ci;
};


int main()
{
    A a(42);
    a.dis();

    return 0;
}

const 修飾類成員函式

  • const修飾成員函式,承諾在本函式內部不會改變類內的資料成員,因此,也只能呼叫承諾不會改變成員的其它const成員函式,而不能呼叫其它非const成員函式。

  • const修飾成員函式,放在宣告之後,實現體之前。

  • 23行程式碼,它只能呼叫const成員函式,如果函式dis()是沒有const修飾的話,第23行程式碼將會報錯。

class A
{
public:
    A(int i, double d, float f)
        :_ci(i), _cd(d), _fe(f)
    {
        cout << "A()" << endl;
    }

    ~A()
    {
        cout << "~A()" << endl;
    }

    void dis() const
    {
        cout << _fe << endl;
    }

    void foo() const
    {
        //_fe = 4.56;
        dis();
    }
private:
    const int _ci;
    const double _cd;
    float _fe;
};


int main()
{
    A a(42, 25, 3.14);
    a.foo();

    return 0;
}

const 修飾物件

const修飾物件,保證在物件層面,不會修改資料成員。所以const物件,只能呼叫const成員函式。

參考資料

Stanley等《C++ Primer e5》
王桂林《C++基礎與提高》

相關文章