复制构造函数

格式:

类名(const 类名& 引用对象名)

{ 复制构造函数体 }

类对象的复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;
class data
{
public:
data(int y,int m,int d):year(y),month(m),day(d){}
private:
int year,month,day;
}
int main()
{
data d1(2016,10,1)
data d2(d1)//等于data d2=d1;复制构造函数两种形式。
}

复制构造函数调用时机

1.对象通过另一个对象进行初始化

2.对象以值传递的方式传入函数参数

1
2
3
4
5
6
7
8
9
10
void fun(data d)
{
...
}
int main()
{
data di(2016,10,1);
fun(d1);//调用时将实参dl对象完整的传递给形参d对象
return 0;
}

3.对象以值传递的方式从函数返回

1
2
3
4
5
6
7
8
9
10
11
12
data fun()
{
data temp(0,0,0);
}
int main()
{
data d1(2016,10,1);
d1=fun();//temp是在函数fun中定义,结束程序时,
//return temp,按temp复制一个新的对象,然后
//赋值给dl;
retrurn 0;
}

注意:以上复制构造函数由编译系统自动调用,编写

深浅复制

浅拷贝(慎用)

​ 概念:也称位拷贝,编译器只是将对象中的值采用基本类型值复制的方式拷贝过来,如果对象中管理资源,就会导致多个对象共享同一份资源(资源泄露),当一个对象销毁时就会将该资源释放,而此时另一些对象不知道该资源已经被释放,以为该资源还有效,所以当继续对资源进行操作时,就会发生访问违规。

深拷贝

​ 概念: 在“深拷贝”的情况下,对于对象中动态成员,就不能仅仅简单地赋值了,而应该重新动态分配空间

注:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

即:动态分配空间地址冲突访问问题。

待补充!!!!