2012-09-23 87 views
1

從我的測試中,創建後仍然可以修改對象。常量對象常量是什麼?

//Let's use this copy constructor as an example: 
Foo::Foo(const Foo& F) 
{ 
    var = F.var; 
} 

//With this code: 
Foo f1; 
const Foo f2(f1); //No Error? 

沒有initializtion列表,所以F2被修改後,已創建。因此,如果Foo的成員仍然可以修改,那麼什麼是不變的?

+1

可能是相關的:http://stackoverflow.com/questions/5656664/c-classes-const-and-strange-syntax – Schnommus

回答

2

f2不是被創建後被修改。這條線

const Foo f2(f1); 

創建f2f2可以修改它自己的數據成員在構造函數體。一旦構造函數的主體退出,對象就完全構造並且不能被修改。

有幾個值得一提的幾點:

  • 如果varconst,那麼你就必須在構造函數的初始化列表來初始化它,它不能在構造函數體進行修改。這與您是否有constFoo實例無關。
  • 如果var被聲明爲mutable,則可以通過修改varconst方法修改const Foo實例。
+0

謝謝。我混淆了const對象和常量數據成員之間的差異。 – Dasaru

1

對象的生命週期不會開始,直到它的構造函數完成(C++ 03 3.8「對象生命週期」),所以,直到這一點沒有什麼可const。特別地,C++ 03 12.1/4 「構造」 表示:

constvolatile語義(7.1.5.1)不被應用在建 對象上。這種語義只有在大多數派生對象(1.8)的構造函數結束後纔會生效。