C 類內初始化方式的選擇細節

2021-09-19 06:48:30 字數 1079 閱讀 5068

以下所有栗子未經特殊說明,全部實現於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...