C++拷贝构造函数与赋值运算符重载函数

C++拷贝构造函数与赋值运算符重载函数

拷贝构造函数又叫做复制构造函数,它是用先前创建的类对象去初始化一个同类对象的特殊构造函数。那么拷贝拷贝构造函数与赋值运算重载函数又有什么样的联系呢?为啥要将它们放在一篇文章中讨论呢?让我们继续往下看!!!

        拷贝构造函数在以下三种情况下均会发生调用:

                @1,用一个类对象去初始化同类的另一个类对象时会发生调用

                @2,函数的形参是类对象,调用函数时,用实参初始化形参时发生调用

                @3,函数的返回值为类对象,函数调用执行完成返回时发生调用(有时由于编绎参数优化的原因,就有可能不会调用拷贝构造函数,比如对于我本机所使用的gcc编绎器,若加上-w  -fno-elide-constructors编绎选项,则生成的代码就会有调用构造函数语句,否则没有)

        赋值运算重载函数又会在什么情况下调用呢?

        顾名思义,就是在当为一个类对象赋值时,该对象就会调用其对应类所提供的赋值运算重载函数,从而发生调用(备注:若类中没有没有对应的赋值运算重载函数?那怎么办,请继续向下看!!!)。

       在类中若没定义拷贝构造函数,编译器会自动定义一个默认的拷贝构造函数,对类对象中的成员变量进行赋值,不过此时的值对用户来说没有任何意义,因为它不确定,是一个随机值,就像使用类提供的默认构造函数一样对类对象中的成员变量随机赋值,没有实际意义。特别是,若类中有指针成员变量,且有动态内存分配情况,则必须定义一个拷贝构造函数,并在其内部重新分配内存空间。若此时仍用默认拷贝构造函数,或自行定义的拷贝构造函数中仍采用浅拷贝方式赋值,在对象析构时,可能会出现同一片内存空间多次释放问题,从而造成程序崩溃现象,对于赋值运算符重载函数来说存在着同样的问题,若类中有指针成员变量,且存在动态内存分配现象,那么在赋值运算符重载函数中,也要重新进行内存分配,否则也可能会出现一片内存空间多次释放,造成程序崩溃现象。建议,在类中若存在指针成员且有动态内存分配,那么至少要实现一个深考贝的拷贝构造函数,至于赋值运费符函数可以不实现,因为在一个类中若实现了拷贝构造函数,即使你没实现赋值运算符重载函数,那么在实际使用中,当你用一个对象给另一个对象赋值时编绎器也会给你调用拷贝构造函数赋值,若同时存在匹配的拷贝构造函数与赋值运算符重载函数,此时存在的匹配赋值运算符重载函数就会被调用。

作者:奋斗者快乐着 https://www.bilibili.com/read/cv16169735/ 出处:bilibili

猜你喜欢

转载自blog.csdn.net/shaozheng0503/article/details/130072299