构造函数应用于以下三中情况:
(1)创建一个对象
(2)给对象初始化
(3)担当类型转换的角色
构造函数用来创建一个对象大家都知道这里就不详细说明了,下面仔细的分析下第2,3种情况。
给对象初始化:
以下这个例子的运行结果是调用了两次构造函数。第一次是Test t;调用构造函数构造一个对象。第二次是t = 100;调用构造函数给对象初始化。那么为什么这里会调用一次构造函数呢?看下面的分析。
#include <iostream>
using namespace std;
class Test
{
public:
Test(int d = 0)
{
cout<<"create a object"<<this<<endl;
data = d;
}
private:
int data;
};
int main(int argc, char **argv)
{
Test t; //构造对象
t = 100;
//给对象初始化。(这里有个疑问为什么一个整型值100可以给一个Test类型的对象赋值,两个的类型都
return 0; 不一样)
}
之所以能进行赋值是因为构造函数能接收一个整型数据,通过整型数据这个参数可以构造一个Test类型的临时对象,这个临时对象的类型跟t的类型相同都是Test类型的,这个临时对象的data值为100,然后这个临时对象把值100给t对象,这个临时对象完成使命后就自己析构了。这样就完成了整型值给对象赋值的操作了。(所以会多因此调用拷贝构造函数,同时也担当了类型转换的角色)
但是有时候这个100是不能够给t赋值的,能不能赋值取决于这个临时对象能不能构建成功。例如下面的例子就不能进行赋值。
如果把上面例子中的构造函数写成这样临时对象就不能构建成功。(因为这个构造函数不能够接收一个整型数据)
Test()
{
cout<<"create a object"<<this<<endl;
data = 0;
}