如果我们在 C++ 中重载构造函数,默认构造函数是不是仍然存在? [复制]
Posted
技术标签:
【中文标题】如果我们在 C++ 中重载构造函数,默认构造函数是不是仍然存在? [复制]【英文标题】:If we overload a constructor in c++ does the default constructor still exist? [duplicate]如果我们在 C++ 中重载构造函数,默认构造函数是否仍然存在? [复制] 【发布时间】:2012-09-04 21:42:08 【问题描述】:可能重复: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(整数) A::A(const A&)
【问题讨论】:
您回答了自己的问题。这是good question 说明原因。 【参考方案1】:这种情况下默认构造函数的存在取决于你是否定义它。如果您自己定义另一个构造函数,它将不再被隐式定义。幸运的是,它很容易带回来:
A() = default;
请注意,术语“默认构造函数”是指可以不带任何参数调用的任何构造函数 (12.1p5);不仅适用于有时隐式定义的构造函数。
【讨论】:
如果你有 C++11。 是的,但这是一种相当不错的短方法。【参考方案2】:不,根据标准默认构造函数在这种情况下不会生成。但是,在 C++11 中,您可以声明您希望使用以下命令生成默认构造函数:
class A
public:
A() = default;
A(int);
;
【讨论】:
【参考方案3】:您可以按照上面的建议编写一个默认构造函数,然后在您的 maing 函数中编写:
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
。
【讨论】:
除非声明了A* obj
,否则A obj = new A(5);
不需要复制构造函数或赋值运算符吗?如果您希望它在堆栈上而不是堆上,我会选择 A obj(5);
。
哦,我的错。我最近一直在写 c#,有点搞混了:)【参考方案4】:
这是 C++ 约定。当您编写任何用户定义的构造函数时,它假定您不需要隐式的非参数构造函数。这是可以理解的,所以记住它。
【讨论】:
以上是关于如果我们在 C++ 中重载构造函数,默认构造函数是不是仍然存在? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
[ C++ ] C++类与对象(中) 类中6个默认成员函数 -- 运算符重载