特殊成员函数

1. c++自动提供了以下的成员函数

默认构造函数,如果没有定义构造函数

默认析构函数,如果没有定义

复制构造函数,如果没有定义

赋值运算符,如果没有定义

地址运算符,如果没有定义

移动构造函数

移动赋值运算符

a. 默认构造函数

编译器在没有提供构造函数时候,编译器将提供一个不接受任何参数,也不执行任何操作的构造函数

如果定义了构造函数,编译器将不提供任何默认构造函数,如果希望创建对象时不显示的对它进行初始化,则必须显示定义默认构造函数,这种构造函数没有任何参数,但是可以使用它来设置特定的值

b. 复制构造函数

复制构造函数用于将一个对象复制到一个新创建的对象中,也就是说,它用于初始化过程中,而不是常规的赋值过程中

调用的时机:

当函数的参数为类对象的时候

函数的返回值是类对象

对象需要另一个对象进行初始化

由于按值传递对象将调用赋值构造函数,因此应该使用按引用传递对象,这样可以节省调用构造函数的时间以及存储新对象的空间。

默认赋值构造函数的功能:逐个赋值非静态成员(成员赋值也称浅赋值),赋值的是成员的值,如果类中存在一个静态的对象计数变量,默认的复制构造函数不说明其行为,也不增加计数器的个数,但是析构函数会更新次数,解决方法是提供一个对计数进行更新的显示复制构造函数

 如果对象中存在指针变量,默认的复制构造函数将不会为该指针分配空间,复制时候会将原对象和复制对象的指针指向同一个位置,析构两个对象会对同一个指针delete两次,从而会出现严重的问题。

警告:如果类中包含了使用new 初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,这称为深度复制。复制的另一种形式(成员复制或者浅复制)只是复制指针值,浅复制仅浅浅复制指针的信息,而不会深入挖掘以复制指针引用的结构

猜你喜欢

转载自www.cnblogs.com/feng-ying/p/10533764.html