2014-06-15 84 views
5

如果已經分配的const變量仍然可以重新分配,那麼它不是一個常量?舉個例子:爲什麼聲明爲類成員的const變量仍然可以修改?

struct ss 
{ 
    const int m = 1024; 

    ss() 
    { 
    } 

    ss(int m) : m(m) 
    { 
    } 
}; 



ss sa; 
ss sb(-1); 

cout << sa.m << endl; 
cout << sb.m << endl; 

哇,畢竟不是一成不變!

> /* Ouput: 
> 
> 1024 
> -1 
> 
> */ 
+1

重新分配?你永遠不會重新分配它。 – chris

+3

相關[在新的C++ 11成員初始化功能在聲明使初始化列表過時?](http://stackoverflow.com/questions/24149924/has-the-new-c11-member-initialization-feature-at -declaration制-initializati/24150137#24150137)。 –

+8

此代碼中沒有賦值或重新分配。只有初始化,每個變量只發生一次。 –

回答

11
ss(int m) : m(m) 
{ 
} 

這是說,當類ss被初始化,其成員m使用參數m被初始化。成員m確實無法修改,但可以初始化,就像任何其他const對象一樣。請注意,如果我們這樣做,而不是

ss(int m) 
{ 
    this->m = m; 
} 

那麼我們將有一個問題,因爲被初始化ss::m需求。如果ss::m是一個默認的構造函數的類,然後在

ss(FooClass m) 
{ 
    this->m = m; 
} 

它是確定不初始化ss::m明確(因爲它將是缺省構造的),但在構造函數體線將被拒絕因爲它在已經初始化之後會修改ss::m

編輯:哎呀,我不明白你原來的問題。

支架 - 或等於初始值設定

const int m = 1024; 

如果構件未在構造函數-初始化提及,僅使用。換句話說,由於默認構造函數沒有明確初始化m,因此使用值1024。但是ss::ss(int)明確地初始化了m,所以括號或相等初始化程序被忽略。

+3

您沒有解決'const int m = 1024;'這一行,這是問題的關鍵。 – user2357112

+0

@ user2357112對不起,請參閱編輯 – Brian

+0

+1,但最後您的術語錯誤。 * mem-initializer *是構造函數初始值設定項列表中的初始值設定項。非靜態數據成員初始值設定項是* brace-equal-initializer *。 – Praetorian

5

你舉的例子只是初始化的不同模式的交易,沒有調動發生在這裏。你們看到正在優於類成員初始化,我們可以從draft C++ standard部分12.6.2初始化基地和成員款它說看到構造函數初始化列表的效果:

如果給定的非靜態數據成員既具有 支架 - 或等於初始值設定和MEM-初始化,由MEM-初始化指定的初始化 被執行,並且非靜態數據 構件的支架 - 或等於初始值設定被忽略。 [實施例:鑑於

struct A { 
int i =/some integer expression with side effects/; 
A(int arg) : i(arg) { } 
// ... 
}; 

的A(int)構造將簡單地初始化i到精氨酸, 的值和副作用在我的大括號orequal-初始化不會採取 地方。末端示例]

Has the new C++11 member initialization feature at declaration made initialization lists obsolete?此討論的是一個有用的特徵,因爲它允許你爲默認成員變量,然後覆蓋基於被調用的構造這些默認值。

相關問題