2013-07-25 69 views
-8

取本示例代碼C++複製構造函數的const正確性被忽略?

#include <iostream> 

using namespace std; 
class Address 
{ 
    public: 
    mutable unsigned key; 

    Address() : key(0) {}; 
    Address(int a) : key(a) {}; 

    // const Address but compiler lets us modify it anyway! 
    Address(const Address &n) : key(++n.key) {}; 
    void showKey() { cout << "key is " << key << endl;} 
    void modifyKey(int k) { key = k;} 
}; 

int main() 
{ 
    cout << "Address a " << endl; 
    Address a; 
    a.showKey(); 

    cout << "Address b " << endl; 
    Address b(a); 
    b.showKey(); 

    if (b.key == a .key) 
    cerr << "Wow the compiler doesn't care about const correctness" << endl; 

    return 0; 
} 

Address類的拷貝構造說,如果n到恆定Address對象的引用。因此,我希望修改n引用的對象是不允許的。似乎編譯器允許直接操作n的字段。不過,我注意到如果我在Address複製構造函數中添加一個非const方法並在n上調用它(例如n.myNonConstMethod()),編譯器會發出抱怨。

我很驚訝,這段代碼編譯(我試過g ++和clang ++,它們編譯出來的錯誤或警告)。我誤解了使用const(這不會是第一次!)還是這些編譯器錯誤?

+12

你是認真的嗎?你認爲'可變的無符號密鑰;'是什麼意思? –

+0

構造函數**是** const正確的,編譯器確保你只是告訴編譯器'key'是'mutable',所以它可以在一個常量對象上進行更改。 –

+2

不那麼積極的評論...使用'mutable'你明確地指定了即使對象是const也可以修改關鍵字段。 – log0

回答

3

Pulled from MSDN

此關鍵字[mutable]只能應用於一類的非靜態和非const數據成員。如果一個數據成員被聲明爲可變,那麼從一個const成員函數中爲這個數據成員賦值是合法的。