c++中的重载赋值操作符
Overloaded assignment operator in C++
我是重载新手,所以请原谅我。在我的对象中,我定义了一个操作符=、一个复制构造函数和一个析构函数。一切都表明它应该起作用,但它没有。我的对象是这样的
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>());
相关文章:
- c++中的重载赋值操作符
- 复制构造函数,赋值操作符重载
- c++复制构造函数,重载赋值操作符,方法get()
- 赋值操作符重载
- 当类是子类时重载赋值操作符
- 模板类的重载赋值操作符
- 使用重载赋值操作符
- 类和向量的重载赋值操作符
- c++模板赋值操作符重载——赋基本类型给对象
- 在可强制转换为另一个模板类型的类模板中重载赋值操作符
- 无法重载赋值操作符
- 赋值操作符重载:错误处理场景
- 使用重载复合赋值操作符时的运行时错误
- 赋值操作符重载未被调用
- c++ const重载赋值操作符机制
- 在子类类中重载基类赋值操作符会导致二义性赋值错误
- 创建了自己的字符串类——重载赋值操作符和析构函数的错误
- 子类,赋值操作符重载
- 算术和赋值操作符重载-返回值,范围,组合表达式
- 模板赋值操作符重载之谜