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