2012-09-04 72 views
3

Possible Duplicate:
Why does the default parameterless constructor go away when you create one with parameters如果我们在C++中重载构造函数,那么默认的构造函数仍然存在?

我写了下面的程序

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

+6

你回答了你自己的问题。这是一个[好问题](http://stackoverflow.com/questions/11792207/why-does-the-default-parameterless-constructor-go-away-when-you-create-one-with)为什么。 – chris

回答

6

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

A() = default; 

请注意,术语“默认构造函数”是指可以不带任何参数(12.1p5)被调用任何构造函数;不仅限于有时被隐含定义的构造函数。

+2

假设你有C++ 11。 –

+0

是的,但这是一个相当不错的方法。 – chris

3

不,根据标准的默认构造函数不会在这种情况下生成。然而,在C++ 11你可以声明要生成默认的构造函数使用:

class A { 
public: 
    A() = default; 
    A(int); 
}; 
0
  • 你可以写一个默认的构造函数如上建议,并在曼村功能写:

    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

+0

不会'A obj = new A(5);'需要复制构造函数或赋值运算符,除非声明为'A * obj'?我会用'obj(5)';如果你想要堆栈而不是堆栈。 – Ghost2

+0

哦,我的坏。我最近一直在c#上写作,并混合了一点:) – DKralev

0

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

相关问题