C 的初始化列表與常物件

2021-09-02 17:32:53 字數 2080 閱讀 4026

一.初始化列表

建構函式的初始化列表 『:』來指明成員的初始化方式

建構函式內部都是賦值

clink(): a(20)     //(int a = 20 初始化a)

b = 30;        //賦值

筆試題:以下這段**  初始化列表中的執行順序問題

(1)test (int a,int b):ma(a),mb(ma)

void show ()

cout<

int ma;

int mb;

int main()

test test1(10,20);

test1.show();

此時列印結果為:ma=10 ;mb=10;

ma先宣告 於是把a=10傳給ma ma在傳給mb

(2)test (int a,int b):mb(ma),ma(a)

void show ()

cout<

int ma;

int mb;

int main()

test test1(10,20);

test1.show();

此時列印結果仍為:ma=10 ;mb=10;

ma先宣告 於是把a=10傳給ma ma在傳給mb 與初始化列表順序無關

(3)test (int a,int b):ma(a),mb(ma)

void show ()

cout<

int mb;

int ma;

int main()

test test1(10,20);

test1.show();

而此時列印的結果為:ma=10 ;mb=87487400(無效值);

此時mb先宣告 於是先把ma賦給mb 此時ma為無效值 所以mb也為無效值;

ma後宣告 於是把a = 10 傳給ma

為什麼兩次列印結果不同?

因為初始化列表中的執行順序只和成員宣告的順序有關 與初始化列表順序無關

(ma先宣告則在初始化列表中則ma先執行 mb後執行)

二.給出以下**:const修飾的成員變數初始化問題

test(int a,int b)

ma = a;

mb = b;

private:

int ma;

const int mb;

此時**錯誤 相當於做了這樣的操作:

const int mb;(const修飾的mb必須要初始化)

mb = b;(常量不能修改)

我們知道函式內部是賦值操作

因此我們需要這樣做:

test(int a,int b):mb(b)

ma = a;

private:

int ma;

const int mb;

此時**正確 相當於做了這樣的操作:

const int mb = b;

因此 const修飾的成員變數一定要在初始化列表中初始化

三.給出以下**:常物件只能呼叫常方法問題 const修飾成員方法

void show() const  //常方法

count<

(*this).show(ma)//常方法中的this指標指向的是常物件 而常物件不能呼叫普通方法 所以常方法不能呼叫普通方法

void show(int ma)  //普通方法

count<

const test test1;//此時被const修飾的物件test1物件稱為常物件

test1.show()//常物件能呼叫普通方法嗎?

常方法與普通方法可以共存 因為引數不同

普通方法的this指標的型別:類型別*const

常方法的this指標就為const tset*const

常物件只能呼叫常方法

常方法不能呼叫普通方法(常方法裡this指標指向的是常物件 常物件只能呼叫常方法)

普通物件可以呼叫常方法

普通方法可以呼叫常方法(普通方法裡this指標指向的是普通物件 普通物件可以呼叫常方法)

c 物件初始化列表

1 物件初始化列表出現原因 1 必須這樣做 如果我們有乙個類成員,它本身是乙個類或者是乙個結構,而且這個成員它只有乙個帶引數的建構函式,沒有預設建構函式。這時要對這個類成員進行初始化,就必須呼叫這個類成員的帶引數的建構函式,如果沒有初始化列表,那麼他將無法完成第一步,就會報錯。2 類成員中若有con...

C 物件導向 初始化列表

初始化列表是指在建構函式中,我們可以提前給建構函式進行初始化。傳統的初始化 person int a,int b,int c 初始化列表 person int a,int b,int c m a a m b b m c c 其實這兩個的區別不是很大,但是平常如果出現了這樣的 要看得懂 我們也可以修改...

初始化列表 常物件 靜態物件的使用方法

class test1 void show private int ma int mb int main 注意 初始化列表中執行順序為成員變數的宣告順序有關,const成員和引用成員只能在初始化列表初始化 int main 注意 常物件只能呼叫常方法,常方法不可以呼叫普通方法 普通成員方法可以呼叫常...