一、特殊的构造函数
1.无参构造函数
没有参数的构造函数
当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空
/*问:下列类中有什么?*/
class T
{
//至少有一个编译器默认提供的构造函数 T(){},
};
2.拷贝构造函数
参数为const class_name&的构造函数
当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制
二、拷贝构造函数意义
--兼容 C语言的初始化方式
--初始化行为能够 符合预期的逻辑
--浅拷贝后对象的物理状态相同
--深拷贝后对象的逻辑状态相同
-编译器提供的拷贝函数只是进行浅拷贝
#include<stdio.h>
class Test
{
private:
int i;
int j;
int* p;
public:
Test(int v)
{
i = 1;
j = 2;
p = new int;
*p =v;
}
int getI()
{
return i;
}
int* getp()
{
return p;
}
int getJ()
{
return j;
}
/*默认提供一个构造函数*/
//Test()
// {
// }
/*深拷贝构造函数*/
Test(const Test& t)
{
i = t.i;
j = t.j;
p=new int ;
*p=*t.p;
}
void free()
{
delete p;
}
Test()
{
}
};
/*
class T
{
//此类中至少有一个默认的构造函数
};
*/
int main()
{
Test t1(3);
Test t2 = t1; // Test t2(t1) 用一个对象初始化已经定义的对象
printf("t1.i=%d ,t1.p = %d , t1.j = %d \n",t1.getI(),*t1.getp(),t1.getJ());
printf("t2.i=%d ,t2.p = %d , t2.j = %d \n",t2.getI(),*t2.getp(),t2.getJ());
t1.free();
t2.free();
return 0;
}
三、拷贝构造函数意义
什么时候需要进行深拷贝 ?
---对象中有成员指代了系统中的资源
.成员指向了动态内存空间
.成员打开了外存中的文件
.成员使用了系统中的网络端口
四、自定义拷贝构造函数
自定义拷贝构造函数,必须要实现深拷贝