C 類內成員初始化

2021-08-13 00:52:08 字數 2430 閱讀 8877

所有標準為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 我的一些程式設計師朋友說第二種方法比較好,但他們都不知道為什麼...