当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须为他提供默认构造函数。
我们怎么理解这句话呢?
首先,什么是默认构造函数?
默认构造函数时在未提供显示初始化时,用来创建对象的构造函数。也就是说,它是用于下面这种声明的构造函数:
expa expa;
然后我们看下没有声明默认构造函数出错的例子:
#include<iostream>
using namespace std;
class expa
{
int x;
int y;
public:
expa(int a,int b); //这个是非默认构造函数
int sum( ){ return x+y; }
};
expa::expa(int a,int b)
{
x=a;
y=b;
}
int main()
{
expa expa;
//expa expa(1,2);
//cout << expa.sum() << endl;
}
error:类expa没有默认构造函数。
修改后:
#include<iostream>
using namespace std;
class expa
{
int x;
int y;
public:
expa();
expa(int a,int b);
int sum( ){ return x+y; }
};
expa::expa(int a,int b)
{
x=a;
y=b;
}
int main()
{
expa expa;
//expa expa(1,2);
//cout << expa.sum() << endl;
}
这个错误消除了,导致了新的问题,没有初始化。
1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall expa::expa(void)" (??0expa@@QAE@XZ),该符号在函数 _main 中被引用
1>F:\vs project\香蕉船\Debug\香蕉船.exe : fatal error LNK1120: 1 个无法解析的外部命令
我们将默认构造改为另一种形式进行初始化的默认构造:
expa():x(0),y(0){} ;
ITS OVER!! ITS OVER!!Congratulations to Cleveland!!!
最后提供代码可以自己试一试:
#include<iostream>
using namespace std;
class expa
{
int x;
int y;
public:
//两种默认构造函数,默认构造函数只能有一个
expa(); //一个没有参数的构造函数
//expa(int a=0,int b=0); //给已有构造函数所有参数提供默认值
//expa():x(0),y(0){} //包含了上面两种共性
//非默认构造函数
expa(int a,int b); //非默认构造函数,a、b只声明没有定义
//expa(int a,int b):x(a),y(b){}; //上一行的衍生体,只不过是在类内定义初始化
int sum( ){ return x+y; }
};
expa::expa(int a,int b) //expa(int a,int b); 的实现
{
x=a;
y=b;
}
int main()
{
expa expa; //这种就必须需要默认构造函数
//expa expa(1,2); //可以不需要默认构造函数
//cout << expa.sum() << endl;
}