编译器的概念创建了默认构造函数

时间:2018-02-06 17:51:33

标签: c++

我已经多次看过这行了,即#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(){}并执行代码时,它会出错。

然后根据定义,为什么编译器没有创建自己的构造函数?

我搜索了许多与默认构造函数相关的类似问题,但找不到我的答案。

2 个答案:

答案 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);

未创建隐含的默认构造函数。