class A {
public:
int _a = 2; //直接赋值
A(){}
}
什么情况下应该这样赋值,什么情况下应该在构造函数里赋值?
怪我咯2017-04-17 13:32:47
class A {
public:
int _a = 2; // 类内初始化
A(){}
}
這樣的寫法與
class A {
public:
int _a;
A() : _a(2) {} // 构造函数初始化列表
}
效果相同,賦初值的過程都會發生在建構子的成員初始化階段,前者只是 C++11 增加的語法糖。這樣如果類別有多個建構函式的時候,如果一個成員的初值在這些建構函式中相同,那麼就可以透過類別內初始化的方式設定初值,減少重複勞動。
迷茫2017-04-17 13:32:47
我猜你應該是想在每一個類別初始化的時候就把_a賦值為2吧?
這種情況就把int _a = 2寫到A的預設建構子裡面好了。
A(){_a = 2;}
還是說你想多個類別的實例共用一個_a變數?
這種情況你應該用static關鍵字
static int _a;
也要注意一下存取權
怪我咯2017-04-17 13:32:47
這個比較方便的是可以直接在聲明的時候使用type var=?
或者type var{}
賦值,可以擺脫一個為了初始化而寫構造函數的麻煩,不過這需要最新的c++11
標準才行,相對於初始化列表,不用再為了擺脫編譯器的初始化與宣告順序不一致的警告(這有時候其實是非常危險的)調整變數在初始化列表中的順序。
struct Init
{
int x = 11;
int z {10};
};
初始化列表是一種非常「古老」的初始化方式,相對於就地初始化優勢也很明顯,並不需要什麼新特性支持,c++所有版本都能支持,還有一個好處就是可以用來委托构造
(c++11)。
struct InitList
{
InitList()
:InitList(10, 11)
{}
InitList(int x, int z)
:x(x)
,z(z)
{}
int x;
int z;
};
至於用什麼是屬於個人習慣的問題,初始化清單更通用一些,目前也可以結合兩者一起使用。
注意:當一個成員在初始化清單和就地初始化同時存在時,初始化清單優先執行,就地初始化會被忽略。