c++中的重载赋值操作符

Overloaded assignment operator in C++

本文关键字:赋值操作符 重载 c++      更新时间:2023-10-16

我是重载新手,所以请原谅我。在我的对象中,我定义了一个操作符=、一个复制构造函数和一个析构函数。一切都表明它应该起作用,但它没有。我的对象是这样的

class myObject
{
    public:
    myObject()
    {
        internalPtr = NULL;
    }
    myObject(const myObject& rhs)
    {
        internalPtr = rhs.internalPtr;
    }
    ~myObject()
    {
        delete[] internalPtr;
    }
    myObject& operator= (const myObject& rhs)
    {
        this->empty(); //this will delete[] internalPtr
        internalPtr = rhs.internalPtr;
        return *this;
    }
    //Other methods are used to allocate internalPtr with new when needed
    private:
    double* internalPtr;
}
myObject add(myObject A, myObject B)
{
    myObject C;
    //simple code to add A and B together and store it back into C.internalPtr
    return C;
} 

当我运行调用

的测试函数时
C = add(A,B);   //A,B,and C are myObject

C将为空,并且不包含add()返回的对象

我在这里做错了什么?

提前感谢您的帮助!

如果您不想使用<vector>,则必须通过克隆数组来处理深度复制。但是要做到这一点,您需要跟踪它的大小(假设它是一个私有成员)。

我希望你被允许使用<algorithm>,因为它也适用于数组。

你的构造函数看起来像:

myObject() : internalPtr(nullptr), size(0) { }  // init size  
myObject(const myObject& rhs) : internalPtr(nullptr), size(rhs.size)  // init 
{
    if (rhs.size) {  // if there is something to copy, clone the table:  
        internalPtr = new double[rhs.size];
        std::copy(rhs.internalPtr, rhs.internalPtr + rhs.size, internalPtr);
    }
}

你当然要调整你的empty()来重新初始化大小。

则赋值如下:

myObject& operator= (const myObject& rhs)
{
    if (this != &rhs) {         //  ATTENTION:  Check that's not a copy on one self bbefore deallocaing !! 
        empty(); //this will delete[] internalPtr
        internalPtr = new double[rhs.size];
        size = rhs.size; 
        std::copy(rhs.internalPtr, rhs.internalPtr + rhs.size, internalPtr);
    }
    return *this;
}

你的原始代码是一个很好的例子,如果对象将自己赋值给自己,可能会出现什么问题。看看上面关于如何避免这种情况的评论。

然后add()看起来像:

myObject add(myObject A, myObject B)
{
    myObject C = A;   // create C by cloning object A 
    //simple code to add B to C 
    return C;
}
顺便说一下,如果您将这个函数作为类的友函数,那么简单的代码将看起来真的很简单,就像:
    int sz = min(C.size, B.size);  // avoid out of bounds if B is bigger or smaller than C
    std::transform (C.internalPtr, C.internalPtr + sz, B.internalPtr, C.internalPtr, std::plus<double>());