所有標準為c11標準,舊的就不看了。
首先說一條指導規則:通常情況下,不應該在類內部初始化成員!!無論是否為靜態、是否為常量、是否為int等!!統統不建議在類內初始化,因為本質上類只是宣告,並不分配記憶體,而初始化會分配記憶體,類內初始化會將兩個過程混在一起!
按順序說。
首先靜態成員,用static限制的成員:
在類內初始化靜態成員,那麼就必須滿足如下條件才行:
1)靜態成員必須為字面值常量型別:constexpr。
2)給靜態成員提供的初始值,必須為常量表示式。(這條一般都滿足,沒人閒的找個算式或者變數給其賦值初始化。。。)
下面測試:
一、靜態int變數和靜態double變數:
static
int months1 = 12;
static
double pi1 = 3.14;
結果報錯:
iso c++ forbids in-class
initialization
of non-const
static member 『robin::student::months1』
static int months1 = 12;
c++禁止在類內初始化非靜態常量。對照規則也很明顯,不符合第一條。
二、靜態int常量和靜態double常量
static
const
int months2 = 12;//靜態int常量
這句是沒問題的~
static
const
double pi2 = 3.14;//靜態double常量
這句會報錯:
error: 『constexpr』 needed for
in-class initialization of
static data member 『const
double robin::student::pi2』 of non-integral type [-fpermissive]
static
const
double pi2 = 3.14;
類內初始化靜態成員時需要constexpr。
從兩條規則上看,他們都不滿足,因為都不是字面值常量型別constexpr,而是const型別,這兩個還是有區別的。
但是static const int不報警而static const double報警,猜測是因為int是之前標準遺留下來的。而之前的標準內並沒有const double型別。為了相容性允許繼續可用。。。
三、靜態int字面值常量和靜態double字面值常量
static
constexpr
int months3 = 12;
static
constexpr
double pi3 = 3.14;
ok,完美執行,因為是嚴格符合按照規則一。
四、非靜態int變數和非靜態double變數
int months4 = 12;
double pi4 = 3.14;
沒毛病~
五、非靜態int常量和非靜態double常量
int
const months4 = 12;
double
const pi4 = 3.14;
沒毛病~
說一句第一種情況,像這種靜態非const 成員,一般在類定義cpp中進行賦值:
類宣告中:
static
int months1;
類定義中:
int student::months1 = 100;//這麼賦值,前面要有int型別,然後加類作用域。
其他情況類似的用法也都是可以的,對應好就行。
類宣告中:
static
const
int months2;
類定義中:
const
int student::months2 = 100;
總之總結兩句就是:
1、不建議在類內初始化。
2、靜態成員只有乙個副本,所有的類物件共用。而非靜態成員每個物件有乙個副本。
上張圖:
C 類內成員初始化順序
是類所有的物件的共享的成員,而不是某個物件的成員。它在物件中不占用儲存空間,這個屬性為整個類所共有,不屬於任何乙個具體物件。所以靜態成員不能在類的內部初始化,比如宣告乙個學生類,其中乙個成員為學生總數,則這個變數就應當宣告為靜態變數,應該根據實際需求來設定成員變數。1.成員變數在使用初始化列表初始化...
C 靜態成員的類內初始化
一般來說,關於c 類靜態成員的初始化,並不會讓人感到難以理解,但是提到c 靜態成員的 類內初始化 那就容易迷糊了。我們來看如下 1 2 include3 include4 using namespace std 56 class example 1213 14 include example.h 1...
初始化C 類成員
問題 我的問題是關於初始化c 類成員的。我見過許多這樣的 包括在你的欄目中也見到過 csomeclass csomeclass x 0 y 1 而在別的什麼地方則寫成下面的樣子 csomeclass csomeclass x 0 y 1 我的一些程式設計師朋友說第二種方法比較好,但他們都不知道為什麼...