C 類一定有建構函式嗎

2022-09-22 22:42:19 字數 2538 閱讀 8561

1:任何類如果沒有定義預設建構函式,就會合成出來?

2:合成出來的預設建構函式會明確設定類內每乙個成員的值?

3:如何去證明呢?

如果你對1、2回答的都是不是,請跳過閱讀,以免浪費你的時間

對於問題1與2其實答案都是未必,c++標準是這樣寫的預設建構函式是由編譯器在需要的時候將其合成出來,這裡強調的是需要,而非必需,以程式示例:

[cpp] 

#include  

#include  

using namespace std; 

class a 

; int main() 

#include

#include

using namespace std;

class a

;int main()

這個程式本身沒什麼好講的,能講的就是其彙編**,除錯狀態下進入彙編**如下:

[cpp]

11:    

11:  

你能找到構造函式呼叫的地方嗎即a::a(),:),找不到吧,因為壓根就沒有建構函式,這個類就相當於乙個整形變數(儲存上相似,用法上不同),其空間是堆疊ebp+4這裡的4個位元組

將程式注釋中的

[cpp] 

//string str; 

//string str;

去掉,再次進入彙編看看,**如下:

[html]

10:   int main() 

11:    

10:   int main()

11:  

看看,我們的建構函式出現了吧a:a() :),為什麼會出現呢?

因為類裡面有乙個類叫string,我們跟蹤發現string類定義在include/xstring裡,其形式如下:

[cpp] 

typedef basic_string, allocator > 

string; 

typedef basic_string, allocator >

string;這是乙個模板類,屬於stl範疇,不信你看看sgi stl原始碼,在機會再講,繼教跟蹤,你會發現basic_string有一系列的建構函式,如下:

[html] 

explicit basic_string(const _a& _al = _a()) 

: allocator(_al)  

basic_string(const _myt& _x) 

: allocator(_x.allocator) 

basic_string(const _myt& _x, size_type _p, size_type _m, 

const _a& _al = _a()) 

: allocator(_al)  

basic_string(const _e *_s, size_type _n, 

const _a& _al = _a()) 

: allocator(_al)  

basic_string(const _e *_s, const _a& _al = _a()) 

: allocator(_al)  

basic_string(size_type _n, _e _c, const _a& _al = _a()) 

: allocator(_al)  

explicit basic_string(const _a& _al = _a())

: allocator(_al)

basic_string(const _myt& _x)

: allocator(_x.allocator)

basic_string(const _myt& _x, size_type _p, size_type _m,

const _a& _al = _a())

: allocator(_al)

basic_string(const _e *_s, size_type _n,

const _a& _al = _a())

: allocator(_al)

basic_string(const _e *_s, const _a& _al = _a())

: allocator(_al)

basic_string(size_type _n, _e _c, const _a& _al = _a())

: allocator(_al) 其實重要的是第乙個建構函式,因為此處呼叫就是它,給basic_string分配乙個記憶體分配管理器:)

明白了吧,此處有是因為類裡面有乙個string類的物件,別人屬於你,別人有自已的建構函式,需要為其賦乙個初始值,你總不能不讓吧,於是編譯器就合成乙個預設的建構函式,呼叫string裡的建構函式,為string對像置乙個初始狀態

建構函式的確是不一定會有的,而且類裡的一些內建型別預設建構函式也不會給其設定乙個預設值的,不信你再看看彙編,**有對ptr的賦值:)

有四種情況編譯器會為合成預設建構函式

1:含有預設預設/建構函式的成員類物件

2:帶有預設/建構函式的基類物件

3: 含有虛函式的類

4:繼承虛基類的類

C 類一定有拷貝建構函式嗎

1 c 類裡面無論如何都會有乙個拷貝建構函式 隱含的或者顯示的 是這樣的嗎?2 大學課本裡是這樣寫的若乙個類不帶有拷貝建構函式,則系統為該類隱含定義乙個拷貝建構函式 出自 第245頁 真是這樣的嗎?當追根究底其實都是錯的,拷貝建構函式未必必須有,想想如果乙個類一點都不複雜,編譯器還要定義乙個拷貝建構...

高學歷求職一定有優勢嗎?請耐心看完!

高學歷在求職過程中的優勢一定是有的,但學歷的作用是錦上添花,而不是雪中送炭。因為公司決定招乙個人or裁乙個人從來不只看學歷,其中決定因素太多了。你工作能力怎麼樣,學習能力怎麼樣?工作是否積極主動?是不是能和大家協同合作?溝通表達如何?資源整合能力如何?如果乙個人畢業n年了還只把注意力放在學歷優勢上,...

c 類 建構函式 複製建構函式

複製建構函式是一種特殊的建構函式,它的作用是用乙個已經存在的物件去初始化另乙個物件。一般情況下不需要自行定義複製建構函式,系統預設提供乙個逐個複製成員值的複製建構函式。何時要使用呢?1.將新物件初始化為乙個同類物件 2.按值將物件傳遞給函式 3.函式按值返回物件 4.編譯器生成臨時物件 簡單的樣例如...