以下所有栗子未經特殊說明,全部實現於c++11下在c++中有很多種初始化方式,如下栗子
string s0; // 預設初始化
string s1(s0); // 拷貝初始化
string s2("hello world!"); // 直接初始化
string s3; // 列表初始化
string s4 = "hello world!"; // 拷貝初始化
string s5(10, '*'); // 直接初始化
string s6 = s0; // 拷貝初始化,等價於 s1(s0)
注意:列表初始化作為c++11的一部分,現在得到全面的應用。但是在這之前,使用花括號這種初始化形式只能應用於一些場合下。考慮以下類的宣告但是如果我們使用列表初始化,初始值存在丟失的風險,那麼將會直接報錯
double banana = 1.23456789;
inr orange(banana); // 成功,但是丟失了精度
class test ;
這在編譯時會發生乙個錯誤,錯誤資訊為
error: expected identifier before string constant
error: expected 『,』 or 『...』 before string constant
報錯的原因是對類內初始值的限制,在提供類內初始值(c++11)時,不能使用直接初始化的方式。簡單點說,就是不能使用圓括號直接進行類內初始化,其他幾種方式都沒問題,甚至你可以使用以下方式
class test
考慮下面栗子,有哪些錯誤
class base1
};class base2
};class test ;
C 類內成員初始化
所有標準為c11標準,舊的就不看了。首先說一條指導規則 通常情況下,不應該在類內部初始化成員!無論是否為靜態 是否為常量 是否為int等!統統不建議在類內初始化,因為本質上類只是宣告,並不分配記憶體,而初始化會分配記憶體,類內初始化會將兩個過程混在一起!按順序說。首先靜態成員,用static限制的成...
C 類內成員初始化順序
是類所有的物件的共享的成員,而不是某個物件的成員。它在物件中不占用儲存空間,這個屬性為整個類所共有,不屬於任何乙個具體物件。所以靜態成員不能在類的內部初始化,比如宣告乙個學生類,其中乙個成員為學生總數,則這個變數就應當宣告為靜態變數,應該根據實際需求來設定成員變數。1.成員變數在使用初始化列表初始化...
C 靜態成員的類內初始化
一般來說,關於c 類靜態成員的初始化,並不會讓人感到難以理解,但是提到c 靜態成員的 類內初始化 那就容易迷糊了。我們來看如下 1 2 include3 include4 using namespace std 56 class example 1213 14 include example.h 1...