我已经多次看过这行了,即#34;当没有构造函数定义时,编译器会提供自己的默认构造函数"。所以我试着从下面的代码中理解它。
这段代码添加了两个复数。
#include<iostream>
#include<iomanip>
using namespace std;
class complex
{
float x,y;
public:
complex(){}
complex(float a)
{
x=y=a;
}
complex(float real,float imag)
{
x=real;
y=imag;
}
friend complex sum(complex,complex);
friend void show(complex);
};
complex sum(complex a,complex b)
{
complex c;
c.x=a.x+b.x;
c.y=a.y+b.y;
return(c);
}
void show(complex c)
{
cout<<c.x<<"+j"<<c.y<<endl;
}
int main()
{
complex A(2);
complex B(4,5);
complex C;
C=sum(A,B);
show(A);
show(B);
show(C);
return 0;
}
我在complex C
函数中写了int main()
。因此,此对象在类complex(){}
中编写的complex
的帮助下初始化。
但是,当我删除此complex(){}
并执行代码时,它会出错。
然后根据定义,为什么编译器没有创建自己的构造函数?
我搜索了许多与默认构造函数相关的类似问题,但找不到我的答案。
答案 0 :(得分:3)
仔细阅读报价。
如果没有定义构造函数,那么编译器会提供自己的默认构造函数
这并没有说“如果你没有定义一个默认的构造函数,你会自动得到一个”。它说“如果你没有定义任何构造函数,你会自动得到一个默认构造函数”。因此,您的complex(float)
和complex(float, float)
构造函数会阻止创建默认构造函数。
请注意,除了您定义的其他一些构造函数之外,如果您需要编译器生成的默认构造函数,那么在C ++ 11及更高版本中您可以显式创建一个。
class complex {
complex() = default;
...
}
答案 1 :(得分:1)
来自the C++11 Standard(强调我的):
类
X
的默认构造函数是类X
的构造函数,可以在不带参数的情况下调用。 如果类X
没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值。
当存在任何其他用户声明的构造函数时,不会创建隐含的默认构造函数。
如果您有以下构造函数
complex(float a);
complex(float real,float imag);
未创建隐含的默认构造函数。