这两天被深拷贝和浅拷贝弄得头晕晕的,决定认真看一下这其中的奥秘。总结如下,各位大神轻喷。
1、什么情况下会调用拷贝构造函数?
(1)一个对象以值传递的方式传入函数体。
(2)一个对象以值传递的方式从函数返回。
(3)一个对象需要通过另一个对象进行初始化。即当用一个已初始化的自定义类型对象去初始化另一个新构造的对象时,拷贝构造函数被调用。
2、什么是前拷贝和深拷贝?
浅拷贝即位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
而深拷贝会重新分配资源。
扩展,举个例子分析拷贝函数容易犯错的情况:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#include<iostream>
using namespace std;
class
MyClass
{
public
:
MyClass(
int
i =
0
)
{
cout << i;
}
MyClass(
const
MyClass &x)
{
cout <<
2
;
}
MyClass &operator=(
const
MyClass &x)
{
cout <<
3
;
return
*
this
;
}
~MyClass()
{
cout <<
4
;
}
};
int
main()
{
MyClass obj1(
1
), obj2(
2
);
MyClass obj3 = obj1;
return
0
;
}
上面程序输出的是什么?
答案是122444,为什么不是123444,
这是因为MyClass obj3 = obj1;中的obj3是新建的对象,那么将调用拷贝构造函数而不是赋值函数。
如果程序改成MyClass obj3;obj3=obj1。那么将调用重载的赋值函数。
|