4

可能重复:
为什么在创建带参数的构造函数时默认的无参数构造函数消失

我写了以下程序

#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&)

4

4 回答 4

7

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

A() = default;

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

于 2012-09-04T21:45:18.440 回答
5

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

class A {
public:
  A() = default;
  A(int);
};
于 2012-09-04T21:47:42.850 回答
0
  • 您可以按照上面的建议编写默认构造函数,然后在 main 函数中编写:

    A* obj = new A();

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

    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

于 2012-09-04T21:52:13.730 回答
0

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

于 2012-09-05T02:48:05.773 回答