如果我们在c ++中重载构造函数,默认构造函数是否仍然存在?

时间:2012-09-04 21:42:09

标签: c++ constructor default-constructor

  

可能重复:
  Why does the default parameterless constructor go away when you create one with parameters

我写了以下程序

#include <iostream>
class A {
public:
    A(int i) {std::cout<<"Overloaded constructor"<<std::endl;}
}

int main() {
A obj;
return 0;
}

当我编译程序时,我收到以下错误:

没有匹配函数来调用A :: A() 候选人是: A :: A(INT) A :: A(const A&amp;)

4 个答案:

答案 0 :(得分:6)

在这种情况下,默认构造函数的存在取决于您是否定义它。如果您自己定义另一个构造函数,则不再隐式定义它。幸运的是,它很容易带回来:

A() = default;

请注意,术语“默认构造函数”是指可以在没有任何参数的情况下调用的任何构造函数(12.1p5);不仅是有时隐式定义的构造函数。

答案 1 :(得分:3)

不,根据标准默认构造函数不会在这种情况下生成。但是,在C ++ 11中,您可以声明要使用以下命令生成默认构造函数:

class A {
public:
  A() = default;
  A(int);
};

答案 2 :(得分:0)

  • 您可以按照上面的建议编写默认构造函数,并在maing函数中写入:

    A* obj = new A();

  • 您可以在主函数中编写例如

    A* obj = new A(5);

  • 您可以在构造函数中设置

    public:
    A(int i=0) 
    { 
        cout << "My own  constructor!"; 
    }; 
    

    当您创建该类的对象时,您可以编写

    `A* obj = new A(5);`
    

    将变量i更改为值5
    或者你可以像

    一样初始化你的对象
    `A* obj = new A();` 
    

    将使变量i保留默认值0

答案 3 :(得分:0)

这是C ++惯例。编写任何用户定义的构造函数时,它假定您不需要隐式非参数构造函数。这是可以理解的,所以请记住它。