拷贝构造函数 赋值运算符的重载

拷贝构造函数:

        先说明使用情景:1.一个对象作为函数参数,以值传递的方式传入函数体;

                                     2.一个对象作为函数返回值,以值传递的方式从函数返回;

                                     3.一个对象用于给另一个对象进行初始化;

函数原型:Cperson (Cperson &person)   此处假设类名为Cperson。 注:拷贝构造函数的函数参数声明部分必须用引用或者指针,否则就会与使用情景第一条结合出现死递归的现象

不同使用情景下的例子:第一个情景 : 实参向形参传值  例函数声明int fun(Cperson &person1 )此时的实参向形参传递参数

就类似于初始化形参,从而会调用拷贝构造函数(死递归的原因)。

                                   第二个情景:作为函数返回值   例 函数声明Cperson fun(Cperson &person)  此时的函数返回值为Cperson类类型。由于函数返回值大于8字节时使用辅助空间返回值的性质,相当于将返回值再给辅助空间初始化,此过程便会调用拷贝构造函数。

                                    第三个情景:简单易理解  这里就不描述了。其使用方法有:Cperson person=person1;或者Cperson person(person1);(使用拷贝构造函数出现优化问题见构造对象文章)

补充:浅拷贝与深拷贝的概念

           浅拷贝(主要是针对系统自动生成的拷贝构造函数):我理解也可以说是值拷贝,即原来对象的空间是哪一块,原来对象成员值是多少就直接拷贝给需要初始化的对象。这里重要的点是空间直接赋予这一条。即 例 A.buff=B.buff,因为这种拷贝方式,并未将空间拷贝一份,而是共同使用前一个对象的空间,这会导致前一个对象的数据可能被更改,也会导致出现重复析构的问题,从而程序崩溃,所以避免这种错误,一般自定义拷贝构造函数,且参数加const。

            深拷贝:我理解也可以说是数据拷贝,即只针对右值的相关数据的拷贝(自定义一块空间来接收另一个对象空间里的值),不涉及原空间的占有或者其他。

赋值运算符的重载:(即区别于初始化,原对象存在)

                 例:Cperson person;  person=person1;

  例 赋值运算符的重载:  const Cgoods& operator=(const Cgoods &good)(这里也可以不用引用)
    {
        cout<<"Cgoods& operator=(Cgoods &good)"<<endl;
        if(this == &good)
        {
            return good;
        }
        delete []_name;//释放原来持有的空间  防止原对象已有值得情况
        _name = new char[strlen(good._name)+1];//这里也可以用于拷贝构造函数。
        strncpy(_name,good._name,strlen(good._name)+1);
        _num = good._num;
        _price = good._price;

        return good;
    }

赋值运算符重载函数需要注意的点:

                                                       1.连续赋值的时候(例 person=person1=person2)后面两个对象的赋值行为是通过调用赋值运算符函数实现,而最后一个对象是通过赋值运算符函数返回值进行赋值,所以需要注意赋值运算符函数时是有返回值的。

                                                         2.注意不要自己给自己赋值,因为赋值运算符重载函数会先释放掉本对象持有的空间,这就会导致本对象给本对象赋值时,出现指针失效的后果。

                                                             3.能否将其他类型的值转换成给对象赋的值的判断条件是:是否具有满足该参数的相关的重载函数

拷贝构造函数即赋值运算符函数在构造不同类型值时所涉及的优化及过程见构造对象文章

猜你喜欢

转载自blog.csdn.net/wm06260514/article/details/81386993