20240611 浅拷贝深拷贝
明昧 Lv7

浅拷贝

1
2
3
4
5
6
7
8
9
10
11
12
13
class X
{
private:
int i;
int *pi;
public:
X()
: pi(new int)
{ }
X(const X& copy)
: i(copy.i), pi(copy.pi) //仔细观察这里的指针和下面指针的区别
{ }
};

在这里,pi原始X对象和复制对象的成员都将指向同一个int.

深拷贝

原始的所有成员都被克隆(如有必要,递归)。没有共享对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
class X
{
private:
int i;
int *pi;
public:
X()
: pi(new int)
{ }
X(const X& copy)
: i(copy.i), pi(new int(*copy.pi)) // //仔细观察这里的指针和下面指针的区别
{ }
};

在这里,pi原始对象和复制X对象的成员将指向不同的int对象,但它们具有相同的值。

一个例子

1680315559105

总结

  • 主要就是有指针/会被动态分配内存的地方必须要小心深拷贝和浅拷贝

  • 复制构造函数执行什么类型的复制?

它依赖于实现。这意味着没有严格的规则,你可以像深拷贝或浅拷贝一样实现它,但据我所知,在拷贝构造函数中实现深拷贝是一种常见的做法。不过,默认复制构造函数执行浅拷贝。

  • 自定义拷贝构造函数和赋值操作符

    为了防止浅拷贝带来的问题,可以自定义拷贝构造函数和赋值操作符来实现深拷贝。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 自定义拷贝构造函数(深拷贝)
Deep(const Deep& other) {
data = new int(*other.data);
}

// 自定义赋值操作符(深拷贝)
Deep& operator=(const Deep& other) {
if (this == &other) {
return *this; // 防止自赋值
}

// 释放旧内存
delete data;

// 分配新内存并复制值
data = new int(*other.data);

return *this;
}

 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
Unique Visitor Page View