簡體   English   中英

強制編譯器在C ++中提供默認構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM