コンストラクターを定義せずに 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
のとおり、上記のスニペットには命令が 1 つしかありません (行番号 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