1. 程式人生 > >常量物件、常量成員函式和常引用

常量物件、常量成員函式和常引用

本章內容均為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值的語句了。