常量物件、常量成員函式和常引用
阿新 • • 發佈:2019-02-06
本章內容均為coursera中C++程式設計課件的整理
常量物件
如果不希望某個物件的值被改變,則定義該物件的時候可以在前面加const關鍵字。
class Demo{
private :
int value;
public:
void SetValue() { }
};
const Demo Obj; // 常量物件
常量成員函式
在類的成員函式說明後面可以加const關鍵字,則該成員函式成為常量成員函式。
常量成員函式執行期間不應修改其所作用的物件。因此,在常量成員函式中不能修改成員變數的值
(靜態成員變數除外),也不能呼叫同類的非常量成員函式(靜態成員函式除外)。
常量成員函式的過載class Sample { public: int value; void GetValue() const; void func() { }; Sample() { } }; void Sample::GetValue() const { value = 0; // wrong 常量成員函式不可修改其所作用的物件,故不可修改成員變數的值 func(); //wrong 常量成員函式不可修改其所作用的物件,故不可呼叫同類的非常量成員函式 } int main() { const Sample o; o.value = 100; //err.常量物件不可被修改 o.func(); //err.常量物件上面不能執行非常量成員函式 o.GetValue(); //ok,常量物件上可以執行常量成員函式 return 0; } //在Dev C++中,要為Sample類編寫無參建構函式才可以,Visual Studio2010中不需要
兩個成員函式,名字和引數表都一樣,但是一個是const,一個不是,算過載。
class CTest { private : int n; public: CTest() { n = 1 ; } int GetValue() const { return n ; } int GetValue() { return 2 * n ; } }; int main() { const CTest objTest1; CTest objTest2; cout << objTest1.GetValue() << "," << objTest2.GetValue() ; return 0; }
常量資料成員
類中常量資料成員必須在建構函式的初始化列表中進行初始化!因為一旦進入建構函式,此常量資料成員不能再改變。
有關const成員、static成員、const static成員的初始化:
1、const成員:只能在建構函式後的初始化列表中初始化
2、static成員:初始化在類外,且不加static修飾
3、const static成員:類只有唯一一份拷貝,且數值不能改變。因此,可以在類中宣告處初始化,也可以像static在類外初始化
#include <iostream> using std::cout; using std::endl; class base { public: base(int x=8):a(x){};//const成員在建構函式初始化 const int a; static int b; const static int c=9;//const static成員在類內初始化 }; int base::b=9;//static成員在類外初始化,可以修改 //const int base::c=10;//也可以像static在類外初始化 int main() { base obj; cout<<obj.a<<endl; cout<<base::b<<endl; cout<<base::c<<endl; }
常引用
引用前面可以加const關鍵字,成為常引用。不能通過常引用,修改其引用的變數。
const int & r = n;
r = 5; //error
n = 4; //ok
物件作為函式的引數時,生成該引數需要呼叫複製建構函式,效率比較低。用指標作引數,程式碼又不好看,如何解決?
可以用物件的引用作為引數,如:
class Sample {
…
};
void PrintfObj(Sample & o)
{
……
}
物件引用作為函式的引數有一定風險性,若函式 中不小心修改了形參o,則實參也跟著變,這可能不是我們想要的。如何避免?
可以用物件的常引用作為引數,如:
class Sample {
…
};
void PrintfObj( const Sample & o)
{
……
}
這樣函式中就能確保不會出現無意中更改o值的語句了。