1樓:匿名使用者
在建構函式體執行前,會執行類的初始化序列。
classa::classa()
: ... ... // 冒號後面的**就是初始化序列一般,類的成員應該在初始化序列裡顯式的初始化。
但如果你不這麼做,編譯器也會幫你呼叫這個成員所屬類的預設建構函式來初始化這個成員。
但是如果這個成員所屬的類沒有預設建構函式,那編譯就會報錯。這時你必須在成員初始化序列中顯示的初始化這個成員。
2樓:匿名使用者
不太明白你問的是什麼意思,我想你問的意思應該是“一個類的建構函式中可不可以不包含對其子物件的初始化啊?”,如果是這個意思,我想我能回答這個問題:
如果其子物件的建構函式中有引數則就必須包含對其子物件的初始化,反之,則不包含。其實,傳不傳引數取決於該物件所屬類的建構函式是否有引數,不管在哪種情況下都遵循這個規律。
3樓:匿名使用者
從語法角度來講沒有問題,但應用可能會存在問題
建構函式是用來初始化所定義的物件,如果一個類中沒有定義任何建構函式則該物件便無法初始化說法對嗎?
4樓:匿名使用者
如果一個類中沒有定義任何建構函式,編譯器就會自動合成一個預設建構函式,並對一些類的成員進行初始化,你可以執行一下這個程式:
雖然類y沒有定義建構函式,但其成員_x還是被初始化了,即編譯器合成的建構函式呼叫了x的建構函式,將_a初始化為33
#include
using namespace std;
class x
int _a;
};class y
;int main()
c++中子物件的初始化可在複合類的建構函式的函式體內進行嗎?還是子物件的初始化只能在初始化列表中進行?
5樓:陳宗權
嚴格意義上的子物件初始化只能在複合類的建構函式的初始化列表中進行。
作為變通,你可以在子物件所屬的類中把真正執行初始化工作的**寫成一個普通公開成員函式,在複合類的建構函式體內呼叫這個函式。
class a
a(int d):data(d){}
void init(int d)
};class b
};class c};
類的成員變數一定要在建構函式裡初始化嗎
6樓:好程式設計師
可以直接賦值的,在構造裡寫只不過是為了方便,因為使用一個類的時候通常都要先new出該類的例項
在構造裡賦值,這樣在new這個類的例項的時候成員變數就已經被初始化了。方便使用而已。
子物件怎麼宣告並初始化呢?半徑類中成員變數radius,圓類中怎麼宣告並初始化子物件r使之寫成r.radius 5
7樓:山水阿銳
您好,當一個類的物件用作另一個類的資料成員時,稱為物件成員或子物件(sub-class)。包含子物件的類被稱為複合類(composite class)。這種功能稱為複合(composition)。
例如:class a
;class b
;其中class b中的成員a(即class a的物件)是子物件。子物件也需要初始化,這也要依靠初始化列表。
class circle
public circle(double r)public double area()
public double circumference()public double getradius()public void setradius(double radius)
public string tostring()}
c中子類建構函式中如何呼叫父類建構函式
四捨 入 class a class b a 子類的子類呼叫父類中的隱藏成員 一般情況,在呼叫父類成員時子2代和子1代沒什麼區別。但如果子1代隱藏父類成員,情況就會不同。像上面的情況,son隱藏了父類的成員變數name和成員方法tellname 如果再有乙個類grandson繼承son,那grand...
c的類中在建構函式中呼叫析構函式會發生什麼
就跟呼叫成員函式一樣,在語法上是可行的 但是由於析構函式的功能,在語義上可能會有無法預料的結果因為在物件銷毀時會隱式呼叫一次,可能會出問題同時考慮這個 偽 class a a 這個屬於合法不合理的事,除非你析構設計的就是想隨時呼叫都沒事。 無論是在基類還是在子類,類的析構函式都是不允許被顯式呼叫的,...
C 中的建構函式問題,c 建構函式的問題
建構函式一般用來對類中的資料成員進行初始化工作,但並不是要對全部資料初始化,你只需要選擇自己需要的資料進行賦值即可。其實這一點從預設的建構函式也能看出來 當你沒有顯示的寫乙個建構函式的時候,編譯器會為你提供乙個預設的建構函式,它沒有引數,只有乙個空語句,也就是說它沒有對任何資料成員進行初始化。由於構...