是一种特殊的构造函数,特殊之处在于它有的时候会隐式调用
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的值也会发生变化。
比如你需要在一张图上面添加新的元素的时候,为了不破坏原来的图片,就需要新建一个图层,把你新添加的元素放在新建的这个图层中。 拷贝图层也就是复制图层,也是为了不破坏原图片需要做的一步工作,当然如果你很有把握一次做成功,也可以省略掉这一步。 背景图层就是最下面的那张图,很明白的意思就是一个背景。欢迎分享,转载请注明来源:优选云