什么是拷贝构造函数?什么是拷贝构造函数?在什么情况下必须实现拷贝构造函数,请说明理由?

宝宝妈妈2023-05-16  58

什么是拷贝构造函数?

是一种特殊的构造函数,特殊之处在于它有的时候会隐式调用

class A {

public:

A(int x, int y, ...) // 普通构造函数

A(const A&) // 拷贝构造函数,一个参数必须是引用类型

}

当你有个函数

calculate(A a) {...}

你调用的时候

A a_in_main(...) // 调用普通构造函数

calculate(a_in_main)// 这个调用因为是参数是A类型的(不是引用也不是指针),所以要拷贝这个对象,这时就会用a_in_main作为A(const A&other)的参数other,在函数calculate中构造一个新的A类对象。

在什么情况下必须实现拷贝构造函数?

因为你不忽略拷贝构造函数的时候,编译器会给你生成一个按数据位拷贝的一个默认版本,即把类的数据成员直接拷贝到新的对象中。这样如果成员有指针指向动态分配的内存,那么直接拷贝指针就会使两个对象中的指针指向同样的内存,一般情况下这种效果都不是想要的。还有一种说法是深拷贝浅拷贝,编译器给你生成的默认版本就是浅拷贝,不会管你指针指向的是什么,只会给你直接把指针的值复制过去。所以只要你需要深拷贝的时候,才需要实现拷贝构造函数。

返回指定列表的副本时。

直接赋值可以看到对b的赋值了a的值,但是修改b的值,a的值也会发生变化因为赋值其实就说应用对象的内存地址,并不是重新开辟新的内存空间进行储存,所以a的值也会发生变化。

比如你需要在一张图上面添加新的元素的时候,为了不破坏原来的图片,就需要新建一个图层,把你新添加的元素放在新建的这个图层中。 拷贝图层也就是复制图层,也是为了不破坏原图片需要做的一步工作,当然如果你很有把握一次做成功,也可以省略掉这一步。 背景图层就是最下面的那张图,很明白的意思就是一个背景。


转载请注明原文地址:https://54852.com/read/671054.html