const成員變數
舉個例子
#include using說明namespace
std;
classa;
private
:
const
intsize;
};int
main()
但是
此時的const變數屬於具體的乙個物件,如何在整個類中都恆定不變呢?
答案是利用列舉,舉例
#include using列舉常量不會佔據物件的儲存空間,在編譯時被全部求值namespace
std;
classa;
public
:
intarray[size];
};int
main()
但是,它隱含的資料物件型別為整形,不能表示其他型別。
問題
如何定義在類中定義非整形常量?(待解決)
話說有幾個地方必須在建構函式的初始化列表中(詳見):
類的const常量
類的引用型別成員
沒有預設建構函式的類型別成員
如果類存在繼承關係,派生類必須在其初始化列表中呼叫基類的建構函式
const成員函式
任何不修改資料成員的函式都應該宣告為const型別。如果在編寫const成員函式時,不慎修改了資料成員,或呼叫了其他非const成員函式,編譯器就會指出錯誤。
示例說明
#include using同乙個類中,可以僅通過是否是const定義兩個函式名字、引數、返回值完全相同的兩個成員函式,例如:namespace
std;
class
stack
;int stack::getcount(void) const
#include using輸出namespace
std;
class
a
void print_val()
void print_val() const
private
:
intval;
};int main(int argc ,char **argv)
結論
同函式名、引數、返回值可以僅通過是否為const來定義為類的兩個成員函式。在呼叫時,const物件呼叫const成員函式,非const物件呼叫非const成員函式。
問題1:
不可以在const函式中改變成員變數的值,那麼有沒有辦法改變?
答案是可以的,把成員變數宣告為mutable型別。看程式
#include using結果namespace
std;
class
a
void print_val()
void print_val() const
private
: mutable
intval;
};int main(int argc ,char **argv)
問題2:
當類中只有const函式,非const物件是否可以呼叫const函式?
答案是可以的,程式
#include using結果namespace
std;
classa//
void print_val()
void print_val() const
private
: mutable
intval;
};int main(int argc ,char **argv)
但是:只有const函式時,非const物件不可以調研那個const函式(否則,類的資料變數就會發生變化)。
問題3:
當類中存在只有 是否為const 不同的兩個函式時,const函式是否可以暫時呼叫那個非const函式?
答案是可以的。用const_cast將轉化掉表示式的const性質
#include using結果namespace
std;
class
a
void print_val()
void
const print_val() const
private
:
intval;
};int main(int argc ,char **argv)
注意
單純用類轉化不行
const a a(45報錯);const_cast
a.print_val();
問題4:返回型別是const是怎麼回事?
const返回型別只有在修飾指標或引用是才有用。單憑const返回型別不可以過載。
分類:
c++/c
const 成員變數
class mytestclass public const int m ciint const string m csstr static int m siint static string m ssstr const static int m csiint const static string...
C 之const類成員變數,const成員函式
const修飾類的成員函式 const修飾變數一般有兩種方式 const t a,或者 t const a,這兩者都是一樣的,主要看const位於 的左邊還是右邊,這裡不再贅述,主要來看一下當const修飾類的成員函式時,成員函式有什麼特點。類的成員函式後面加 const,表明這個函式不會對這個類物...
static與const成員變數
static 很多公司會喜歡問static的作用是什麼,如果不考慮在類當中的應用,其主要作用有以下三點 1 隱藏 加了static的全域性變數,在其他原始檔中就 看不見 了。也就是說,加了static,可以用來解決不同檔案裡定義了同名的函式或者變數。2 預設初始化為0 對於未初始化的全域性變數和靜態...