原谅我是个菜鸟,总在些小地方不经意出错。。。
#include <iostream>
using namespace std;
class X
{
public:
X(int t = 0)
{
a = t;
}
X()
{
a = 1;
}
~X()
{
a = 0;
}
private:
int a;
};
int main()
{
X* p = new X(1); //调用有参构造函数
delete p;
p = 0;
X* p1 = new X; //调用默认构造函数
delete p1;
p1 = 0;
return 0;
}
你是否看得出哪里出错了呢?
接下来让我们编译看看:
ConstructFunc.cpp: In function ‘int main()’:
ConstructFunc.cpp:32: error: call of overloaded ‘X()’ is ambiguous
ConstructFunc.cpp:12: note: candidates are: X::X()
ConstructFunc.cpp:7: note: X::X(int)
这里表示对构造函数的选择上出现二义。那么回看我们的程序,其实这里生成两个实例的方式是p希望是设定参数为1,调用有参数的构造函数。p1是无参数构造。
那么回看我们的构造函数,这里发现了一个问题:
X(int t = 0)
{
a = t;
}
实际上这也是我们的默认构造函数。
什么是默认构造函数:不需要在实例化对象的时候指定实参。
所以这里有了两个默认构造函数:
X::X()
X::X(int t = 0)
一个类中,不能有两个默认构造函数,导致实例化对象时,编译器无法候选适当的构造函数。
解决方法:
实际上,我们是想要重载构造函数,即有实参的构造函数:
X(int t)
{
a = t;
}