class的脊柱
包括了 一个/多个构造函数、一个析构函数、一个拷贝赋值操作符
c++编译器帮你写的默认函数
编译器会帮你声明 一个拷贝构造函数、一个析构函数、一个拷贝赋值操作符
其中,默认的拷贝构造函数是浅拷贝,由拷贝构造生成的对象里的指针会指向同一块内存;如果要避免浅拷贝可以自定义拷贝构造函数
拷贝构造与拷贝赋值是什么
它避免了值传递 pass by value,值传递的意思是将参数复制一份传到函数中,拷贝构造本身就是生成一个副本,如果它又是值传递的话会造成递归复制
拷贝构造函数用于,以同型对象初始化自我对象,所以这里有一个问题是,如果类中包含指针对象,那么调用拷贝构造的时候会把指针也复制一份,这样就会出现可能一个指针被销毁,内存也被销毁,但另一个指针还在的情况,也就是上文说的浅拷贝。
拷贝赋值运算符用于,从一个同型对象中拷贝它的值到自我对象
class Widget{
public:
Widget(); // 构造函数
Widget(const Widget& rhs); // 拷贝构造函数
Widget& operator=(const Widget& rhs); // 拷贝赋值运算符
...
};
Widget w1; // 调用默认构造
Widget w2(w1); // 调用拷贝构造
w1 = w2; // 调用拷贝赋值运算符
Widget w3 = w2; // 调用拷贝构造
补充点:lhs:赋值对象 rhs:赋值源 待续。。
续来了 c++ | 初始化1 | 「构造函数用成员初值列」_tuuzkiii_Tuu的博客-CSDN博客_c++成员初值列
如果不想要拷贝构造函数和拷贝赋值操作符
由于就算不声明,c++也会帮你声明这两个默认函数,因此若要彻底消灭他们——
将拷贝构造函数和拷贝赋值操作符声明为private,并且不去实现它们
class Widget{
public:
...
private:
Widget(const Widget&); // 拷贝构造函数 only声明
Widget& operator=(const Widget& rhs); // 拷贝赋值运算符 参数可写可不写
...
};
关于析构函数
1. 见此链接
2.。。待续