【c++】類中的const成員


const成員變量

舉個例子

#include <iostream>
using namespace std;

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

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

說明

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

但是

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

 答案是利用枚舉,舉例

#include <iostream>
using namespace std;

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

int main()
{
    A a;
}

枚舉常量不會占據對象的存儲空間,在編譯時被全部求值

但是,它隱含的數據對象類型為整形,不能表示其他類型。

問題

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

 

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

  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返回類型不可以重載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM