【c++】類中的const成員

const成員變量html

舉個例子ios

#include <iostream>
using namespace std;

class A
{
    public:
        A(int size) : SIZE(size) {};
    private:
        const int SIZE;
};

int main() { A a(100); }

說明函數

  • 在類中聲明變量爲const類型,可是不能夠初始化
  • const常量的初始化必須在構造函數初始化列表中初始化,而不能夠在構造函數函數體內初始化

可是url

 此時的const變量屬於具體的一個對象,如何在整個類中都恆定不變呢?spa

 答案是利用枚舉,舉例指針

#include <iostream>
using namespace std;

class A
{
    private:
        enum {SIZE = 100};
    public:
        int array[SIZE];
};

int main()
{
    A a;
}

枚舉常量不會佔據對象的存儲空間,在編譯時被所有求值code

可是,它隱含的數據對象類型爲整形,不能表示其餘類型。htm

問題對象

如何定義在類中定義非整形常量?(待解決)blog

 

話說有幾個地方必須在構造函數的初始化列表中(詳見):

  1. 類的const常量
  2. 類的引用類型成員
  3. 沒有默認構造函數的類類型成員
  4. 若是類存在繼承關係,派生類必須在其初始化列表中調用基類的構造函數

 

const成員函數

任何不修改數據成員的函數都應該聲明爲const類型。若是在編寫const成員函數時,不慎修改了數據成員,或調用了其餘非const成員函數,編譯器就會指出錯誤。

示例說明

#include <iostream>
using namespace std;
class Stack
{
    public:
        void Push(int item);
        int Pop(void);
        int GetCount(void) const;
    private:
        int m_num; 
        int m_data[100];
};

int Stack::GetCount(void) const
{
    ++m_num;     //編譯錯誤,企圖修改數據成員
    Pop();       //編譯錯誤,企圖調用非const函數
    return m_num;
}

 

同一個類中,能夠僅經過是不是const定義兩個函數名字、參數、返回值徹底相同的兩個成員函數,例如:

#include <iostream>
using namespace std;

class A
{
    public:
        A(int v): val(v) {}
        void print_val() { cout << "not const:" << val << endl;}
        void print_val() const { cout << "const print_val:" << val << endl;}
    private:
        int val;
};
int main(int argc ,char **argv)
{
    A b(45);
    b.print_val();

    const A a(12);
    a.print_val();
}

輸出

結論

同函數名、參數、返回值能夠僅經過是否爲const來定義爲類的兩個成員函數。在調用時,const對象調用const成員函數,非const對象調用非const成員函數。

問題 1:

不能夠在const函數中改變成員變量的值,那麼有沒有辦法改變?

答案是能夠的,把成員變量聲明爲mutable類型。看程序

#include <iostream>
using namespace std; class A { public: A(int v): val(v) {} void print_val() { cout << "not const:" << val << endl;} void print_val() const { val++; cout << "const print_val:" << val << endl;} private: mutable int val; }; int main(int argc ,char **argv) { A b(45); b.print_val(); const A a(12); a.print_val(); }

結果

 

問題2:

當類中只有const函數,非const對象是否能夠調用const函數?

答案是能夠的,程序

#include <iostream>
using namespace std; class A { public: A(int v): val(v) {} // void print_val() { cout << "not const:" << val << endl;} void print_val() const { val++; cout << "const print_val:" << val << endl;} private: mutable int val; }; int main(int argc ,char **argv) { A b(45); b.print_val(); const A a(12); a.print_val(); }

結果

可是:還有非const函數時,非const對象不能夠調研那個const函數(不然,類的數據變量就會發生變化)。

 

問題3:

當類中存在只有 是否爲const 不一樣的兩個函數時,const函數是否能夠暫時調用那個非const函數?

答案是能夠的。用const_cast將轉化掉表達式的const性質

#include <iostream>
using namespace std;

class A
{
    public:
        A(int v): val(v) {}
        void print_val() { cout << "not const:" << val << endl;}
        void const print_val() const { cout << "const print_val:" << val << endl;}
    private:
        int val;
};
int main(int argc ,char **argv)
{
    A b(45);
    b.print_val();

    const A *a = new A(45);
    const_cast<A*>(a)->print_val();
    a->print_val();
}

結果

注意

單純用類轉化不行

const A a(45);
const_cast<A> a.print_val();

報錯

問題4:返回類型是const是怎麼回事?

const返回類型只有在修飾指針或引用是纔有用。單憑const返回類型不能夠重載。

相關文章
相關標籤/搜索