[英]Forcing the compiler to provide default constructor in C++
我編寫了一個C ++程序而沒有定義任何構造函數。 以下是代碼:
#include<iostream>
using namespace std;
class test
{
public:
void print()
{
cout<< "Inside Print"<<endl;
}
};
int main()
{
test t;
t.print();
return 0;
}
當我解組代碼時,我沒有發現任何調用默認構造函數的情況。 以下是主要功能的匯編代碼片段:
8 main:
9 .LFB1516:
10 pushl %ebp
11 .LCFI0:
12 movl %esp, %ebp
13 .LCFI1:
14 subl $8, %esp
15 .LCFI2:
16 andl $-16, %esp
17 movl $0, %eax
18 subl %eax, %esp
19 leal -1(%ebp), %eax
20 movl %eax, (%esp)
21 call _ZN4test5printEv
22 movl $0, %eax
23 leave
24 ret
如您所見,上面的代碼段中只有一條call
指令(第21行)。 它正在調用print()
函數。 現在我稍微修改了我的代碼並引入了一個constructor
。 以下是代碼:
#include<iostream>
using namespace std;
class test
{
public:
test()
{
}
void print()
{
cout<< "Inside Print"<<endl;
}
};
int main()
{
test t;
t.print();
return 0;
}
我再次拆解代碼,發現以下內容:
8 main:
9 .LFB1519:
10 pushl %ebp
11 .LCFI0:
12 movl %esp, %ebp
13 .LCFI1:
14 subl $8, %esp
15 .LCFI2:
16 andl $-16, %esp
17 movl $0, %eax
18 subl %eax, %esp
19 leal -1(%ebp), %eax
20 movl %eax, (%esp)
21 call _ZN4testC1Ev
22 leal -1(%ebp), %eax
23 movl %eax, (%esp)
24 call _ZN4test5printEv
25 movl $0, %eax
26 leave
27 ret
如您所見,它在第21行調用了構造函數。 現在我的問題是,如果我沒有在我的代碼中定義任何構造函數,編譯器是否在所有情況下都提供默認構造函數? 如果沒有,那么在什么情況下,或者我怎樣才能強制編譯器為我提供默認構造函數?
抱歉這個冗長的問題:P
該程序的行為應該如此。 機器代碼生成不是標准的一部分,您無權期望任何特定的機器代碼輸出 - 您只能保證輸出程序完成您告訴它的操作。
為什么要強制你的編譯器膨脹你的二進制文件並減慢你的程序?
只有在有意義的情況下,好的編譯器才會調用默認構造函數( 或任何其他函數 ) - 如果調用它會產生任何影響。
優化只會從程序中排除默認構造函數(它什么都不做)。
如果我沒有在我的代碼中定義任何構造函數,編譯器在所有情況下都不提供默認構造函數
不,僅當您沒有定義任何其他構造函數時。 如果您的類具有任何用戶聲明的構造函數,那么將禁止默認構造函數的隱式聲明。
即使您沒有定義其他構造函數,除非默認構造函數實際上必須執行某些操作,例如調用基類或成員變量的非平凡構造函數,那么它將是微不足道的,因此將不執行任何操作,因此沒有代碼需要生成。 只有一個愚蠢的編譯器會生成一個完全空的函數,並且堅持只是為了什么都不做而調用它。
如果沒有,那么在什么情況下,或者我怎樣才能強制編譯器為我提供默認構造函數?
如果你想確保它存在然后定義它,但如果它什么也不做,那就浪費時間了。 如果它需要做一些事情,比如構造基類或成員變量(並且它沒有被另一個用戶聲明的構造函數抑制),那么它將由編譯器創建。
編譯器正在做正確的事情,你不需要強迫它做任何事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.