C++ 构造函数、拷贝构造函数、赋值运算符

《C++ Primer Plus》 12.1 动态内存和类 12.1.1 复习示例和静态类成员

不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存

如果在头文件进行静态成员变量初始化,将出现多个初始化语句副本,从而引发数据类型或枚举型

将对象作为函数参数来传递会导致析构函数被调用,如果对象使用了动态分配内存,可能会出现问题,对象作为函数参数值,调用的是拷贝构造函数,需要实现拷贝构造函数重载

自动存储对象被删除顺序与创建顺序相反

12.1.2 特殊成员函数

默认构造函数

默认构造函数使对象类似于一个常规的自动变量,也就是说,它的值在初始化时是未知的

带参数的构造函数也可以是默认构造函数,只要所有参数都有默认值

复制构造函数

复制构造函数作用于对象初始化过程中(包含按值传递参数),而不是常规的赋值过程中

对于复制构造函数,需要知道两点:何时调用和有何功能

何时调用复制构造函数

每当编译器生成了对象副本时,编译器都将使用复制构造函数

按值传递意味着创建原始变量的一个副本。

编译器生成临时对象时,也将使用复制构造函数。何时生成临时对象随编译器而异,但无论是哪种编译器,当按值传递和返回对象时,都将调用复制构造函数

默认的复制构造函数的功能

默认的复制构造函数逐个复制非静态成员(成员复制也称为浅拷贝),复制的是成员的值

12.1.3 回到Stringbad:复制构造函数的哪里出了问题

如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,也就是进行深拷贝

12.1.4 Stringbad的其他问题:赋值运算符

赋值运算符的功能以及何时实现它

将已有的对象赋值给另一个对象时,将使用重载的赋值运算符

初始化总是会调用拷贝构造函数,而使用=运算符时也允许调用赋值运算符

赋值的问题出在哪里

默认的赋值运算符也是成员复制

解决赋值的问题

解决办法是重载赋值运算符

由于目标对象可能引用了以前分配的数据,所以函数应使用delete[]来释放这些数据

函数应当避免将对象赋值给自身;否则,给对象重新赋值前,释放内存操作可能删除对象的内容

函数返回一个指向调用对象的引用

问题列表(持续更新)

C++的构造函数,拷贝构造函数和赋值运算符的区别
- 详见《C++ Primer Plus》第12章的12.1节
- 分析的比较不错的文章:详解C++ 拷贝构造函数和赋值运算符

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyssx.html