我编写了一个没有定义任何构造函数的 C++ 程序。以下是代码:
#include<iostream>
using namespace std;
class test
{
public:
void print()
{
cout<< "Inside Print"<<endl;
}
};
int main()
{
test t;
t.print();
return 0;
}
当我反汇编代码时,我没有发现任何调用默认构造函数的情况。以下是 main 函数的汇编代码片段:
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