C 類成員初始化的三種方式

2022-09-24 09:33:10 字數 2239 閱讀 3014

目錄

前言:在c++98中,支援了在類宣告中使用等號「=」加初始值的方式,來初始化類中靜態成員常量。這種宣告方式我們也稱之為「就地」宣告。就地宣告在**編寫時非常便利,不過c++98對類中就地宣告的要求卻非常高。如果靜態成員不滿足常量性,則不可以xcwnu就地宣告,而且即使常量的靜態成員也只能是整型或者列舉型才能就地初始化。而非靜態成員變數的初始化則必須在建構函式中進行。

首先,先得了解一下c++支援哪幾種類成員初始化的方式,你常用的又是哪一種。

class a

};class a

};class a

};在c++98中,支援了在類宣告中使用等號「=」加初始值的方式,來初始化類中靜態成員常量。這種宣告方式我們也稱之為「就地」宣告。就地宣告在**編寫時非常便利,不過c++98對類中就地宣告的要求卻非常高。如果靜態成員不滿足常量性,則不可以就地宣告,而且即使常量的靜態成員也只能是整型或者列舉型才能就地初始化。而非靜態成員變數的初始化則必須在建構函式中進行。比如,如下**在c++98中編譯

class init

private:

int a;

const static int b = 0;

www.cppcns.com int c = 1; // member, cannot pass build

static int d = 0; // member, cannot pass build

static www.cppcns.comconst double e = 1.3; // not int or enum type, cannot pass build

stati const char* const f = "e"; // not int or enum type, cannot pass build

}這非常不方便,所以在c++11中,標準允許非靜態成員變數的初始化有多種形式。具體而言,除了初始化列表外,在c++11中,標準還允許使用等號= 或者 花括號{} 進行就地的非靜態成員變數初始化。

struct init ;

};大家知道,有幾種情況下推薦優先使用列表初始化

具體的原因這裡不細述,大家可以去看一下《c++ primer》。

建構函式初始化的本質是賦值操作("="),這個方法存在兩個問題,乙個是比起初始化列表和就地初始化,此方式的效率偏低;第二個是可能存在錯誤隱患。

先說第乙個,賦值過程中會產生臨時物件,臨時物件的構造析構會造成效率損耗,初始化列表的方式就避免了產生臨時物件縮帶來的問題。

第二個是,如果你沒有重寫或者禁止賦值建構函式,c++會悄悄的加上預設的賦值建構函式,這個時候也有可能帶來問題。

從c++11之後,這三種初始化的方法都可以使用,並不會存在衝突,但是,他們之間是有優先順序順序的,這個優先順序**於他們在初始化的時間順序,後面初始化的會把前面的覆蓋掉,成員變數的初始化順程式設計客棧序是

因此假如三種初始化方式同時存在的話,那麼最後保留的成員變數值肯定是建構函式中初始化的值。

#include

using namespace std;

class a

};int main()

// a.a=3

既然初始化方式這麼多,那麼什麼時候適用哪種呢?

乙個優點是直觀,你在宣告的時候順便給乙個初始值,br**o,別人在看你**的時候,點一下調到宣告也能看到你賦予的初始值,不用再去看建構函式那裡給的什麼值

第二個優點更有用了,比如你要定義多個建構函式,每個建構函式都用列表初始化的方法初始化,多麻煩呀,請看下面的例子,媽媽看了再也不用擔心我想用其他初始化方法了

class group

group(int a): data(a) {}

group(mem m): mem(m) {}

group(int a, mem m, string n): data(a), mem(m), name(n) {}

private:

int data = 1;

mem mem;

string name;

};前面說過了三個場景,這裡贅述一下

但是,需要注意列表初始化的順序,不過ide會提示你的

第乙個就是拷貝和賦值建構函式裡(不然怎麼叫賦值建構函式呢)

第二個就是比較無聊的情況了,比如你想把幾個成員函式都初始化成乙個值,請看下面例子

class group

private:

int data1;

int data2;

int data3;

};一言以蔽之,優先就地初始化和列表初始化。

初始化三種方式

陣列的初始化方式總共有三種 靜態初始化 動態初始化 預設初始化。下面針對這三種方式分別講解。1.靜態初始化 除了用new關鍵字來產生陣列以外,還可以直接在定義陣列的同時就為陣列元素分配空間並賦值。示例7 4 靜態初始化陣列 inta 靜態初始化基本型別陣列 man mans 靜態初始化引用型別陣列 ...

C 初始化陣列的三種方式

對於一維陣列 using system using system.data using system.configuration using system.web using system.web.security using system.web.ui using system.web.ui.we...

陣列的三種初始化方式

陣列的初始化方式總共有三種 靜態初始化 動態初始化 預設初始化。靜態初始化 除了用new關鍵字來產生陣列以外,還可以直接在定義陣列的同時就為陣列元素分配空間並賦值。eg int arr int arr new int 注意 1.new int 3 錯誤 2.int arr arr 錯誤動態初始化 陣...