2 回答

TA貢獻(xiàn)1886條經(jīng)驗 獲得超2個贊
舉一個例子,可能你會跟明白些。
No.(4)
class A
{
public:
A(int n=0):data(n){}
void SetData( int n )
{
data = n;
}
int GetData() const // const成員函數(shù)
{
// 在const成員函數(shù)里面【只能取用】成員變量,而【不能修改】該類里面任何的成員變量
// 比如,如下代碼會編譯出錯,
//data = 1; // error C2166: l-value specifies const object
cout << data; // 取用是沒有問題的。
return data;
}
private:
int data;
};
所以,對于一個成員函數(shù),其函數(shù)體內(nèi)的代碼如果只是成員變量,而不會修改任何成員變量,就應(yīng)該給這個函數(shù)加上const,來表達(dá)你的這個意圖。防止以后維護人員不小心在這個函數(shù)里修改了變量,編譯的時候馬上就會知道了。
通常gettor函數(shù)就應(yīng)該設(shè)置成const成員函數(shù)。如上的代碼所示。
還有,附加說明一下:通過一個const對象(object)調(diào)用其成員函數(shù),那只能調(diào)
用const成員函數(shù)。如果聲明了一個上面那個類A的const對象,如下:
const A aObj(10); // aObj是一個常量對象
cout << aObj.GetData(); // ok
//aObj.SetData( 11 ); // error,因為SetData不是const成員函數(shù)
然而,對于非const對象,卻沒有這個限制。非const對象依然可以調(diào)用const成員函數(shù)的。
NO.(5)
struct MyData
{
int a;
int b;
int c;
// ...
};
class MyClass
{
public:
void SetInitData()
{
m_Data.a = 1;
m_Data.b = 1;
m_Data.c = 1;
}
const MyData& GeteMyData() const // 這里面有2個const:)。后面的那個
// const的意思,上面說的那個。
{
return m_Data;
}
private:
MyData m_Data;
};
如下使用:
MyClass myObj;
myObj.SetInitData();
//MyData& myData = myObj.GeteMyData(); 這行代碼會編譯不通過的喲
// 給返回類型的數(shù)據(jù)加上const的引用的意思是,只給你拿去read,但是不允
許你write。
const MyData& myData = myObj.GeteMyData();
//myData.a = 2; // error.嘗試修改,會編譯不通過。
所以第五點的核心意思就是返回一個常量引用,作為只讀數(shù)據(jù)使用。
注:一般情況下,對于這一條,都會指定const T&(注:引用)。

TA貢獻(xiàn)1966條經(jīng)驗 獲得超4個贊
一些情況下類中的成員變量需要賦值后不變,所以會定義為常成員變量,如const a;將類的成員函數(shù)指定為const 類型如void show() const;于是在函數(shù)中,我們可以放心地使用常成員變量和常成員函數(shù),因為在編譯的時候編譯器就會自動檢查這個函數(shù)是否有違規(guī)改變常變量的值,違規(guī)則不會通過編譯。它的作用是對于常變量而言的。
返回值為const的函數(shù)例如const int test();會返回一個const int 型的返回值,如重載運算符“=”,const T &operator=(T &t),T d=(a=b+c);d的值也等于b+c,不會等于a的原值。
- 2 回答
- 0 關(guān)注
- 324 瀏覽
添加回答
舉報