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); }
說明函數
可是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
話說有幾個地方必須在構造函數的初始化列表中(詳見):
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返回類型不能夠重載。