Я написал программу на C++ без определения какого-либо конструктора. Ниже приводится код:Принуждение компилятора предоставить конструктор по умолчанию в C++
#include<iostream>
using namespace std;
class test
{
public:
void print()
{
cout<< "Inside Print"<<endl;
}
};
int main()
{
test t;
t.print();
return 0;
}
Когда я deassembled код, я не нашел появления вызова конструктора по умолчанию. Ниже сборка фрагмент кода главной функции:
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;
}
Я deassembled код снова и нашел следующее:
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
Конструктор не создан, потому что он не нужен. Нечего строить. –
Но когда я создаю объект, конструктор должен быть вызван, правильно ??? –
Попробуйте отключить все оптимизации. –