参考博客(一)
参考博客(二)
下面再写一些自己的总结吧
1、发生拷贝构造还是赋值操作,主要是看有没有产生新的对象,如果有新的对象产生,则调用的是拷贝构造函数,如果没有新对象产生,则调用的是赋值操作。
拷贝构造发生的场合:
1)函数传参是以值传递的方式。此时会调用拷贝构造函数创建一个可以使用的实参。
2)以值的方式作为函数返回值时。此时会调用拷贝构造函数创建一个temp对象,然后再返回这个temp对象。
3)使用一个对象给另一个对象进行初始化。
2、深拷贝和浅拷贝的区别
浅拷贝:完全是把一个对象的成员复制给拷贝对象,此时如果有数据成员是指针类型的,那原来的对象和拷贝后的对象的指针将指向同一片内存区域。
简单来说说,浅拷贝只是复制,不会开辟新的内存空间或者内存划分。
深拷贝:会给指针类型的数据成员开辟新的内存空间,此时源对象和拷贝后对象中指针类型的数据成员将指向不同的内存区域。
3、关于默认拷贝构造函数和默认赋值运算符
编译器会隐式的创建默认拷贝构造函数和赋值运算符,如果不需要,我们可以在代码中使用 delete 来删除。
class Person
{
public:
Person(const Person& p) = delete;
Person& operator=(const Person& p) = delete;
private:
int age;
string name;
};