C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C:实现复制构造函数和复制赋值运算符大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_489_0@
在C中阅读有关复制构造函数和复制赋值运算符之后,我尝试创建一个简单的例子.然下面的代码段显然是有效的,但我不知道我是否正确地执行拷贝构造函数和拷贝赋值运算符.如果有任何错误/改进或更好的例子来了解相关概念,请问你能指出一点.
class Foobase
{
    int bInt;

public:
    Foobase() {}

    Foobase(int b) { bInt = b;}

    int GetValue() { return bInt;}

    int SETVALue(const int& val) { bInt = val; }
};


class Foobar
{
    int var;    
    Foobase *base;      

public:
    Foobar(){}

    Foobar(int v)
    {
        var = v;        
        base = new Foobase(v * -1);

    }

    //Copy constructor
    Foobar(const Foobar& foo)
    {       
        var = foo.var;
        base = new Foobase(foo.GetBaseValue());
    }

    //Copy assignemnt operator
    Foobar& operator= (const Foobar& other)
    {
        if (this != &other) // prevent self-assignment
        {
            var = other.var;
            base = new Foobase(other.GetBaseValue());

        }
        return *this;
    }

    ~Foobar()
    {
        delete base;
    }

    void SETVALue(int val)
    {
        var = val;
    }

    void SetBaseValue(const int& val)
    {
        base->SETVALue(val);
    }

    int GetBaseValue() const
    {
        return(base->GetValue());
    }

    void Print()
    {
        cout<<"Foobar Value: "<<var<<endl;
        cout<<"Foobase Value: "<<base->GetValue()<<endl;

    }   

};

int main()
{
    Foobar f(10);       
    Foobar g(f);  //calls copy constructor
    Foobar h = f; //calls copy constructor

    Foobar i;
    i = f;

    f.SetBaseValue(12);
    f.SETVALue(2);    

    Foobar j = f = z; //copy constructor for j but assignment operator for f

    z.SetBaseValue(777);
    z.SETVALue(77);

    return 1;
}

解决方法

您的副本分配运算符执行不正确.被分配的对象泄露其基点所指向的对象.

您的认构造函数也是不正确的:它使base和var都未初始化,所以无法知道是否有效,并且在析构函数中,当您调用delete base; Bad Things Happen时.

实现复制构造函数和复制赋值操作符并且知道您已经正确完成的最简单的方法是使用the Copy-and-Swap idiom.

大佬总结

以上是大佬教程为你收集整理的C:实现复制构造函数和复制赋值运算符全部内容,希望文章能够帮你解决C:实现复制构造函数和复制赋值运算符所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。