一.初始化列表
建構函式的初始化列表 『:』來指明成員的初始化方式
建構函式內部都是賦值
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 注意 常物件只能呼叫常方法,常方法不可以呼叫普通方法 普通成員方法可以呼叫常...