gpt4 book ai didi

c++ - 重载 C++ 赋值运算符的最佳方法

转载 作者:太空宇宙 更新时间:2023-11-03 10:31:29 25 4
gpt4 key购买 nike

我有一个 A 类,它在其构造函数中为一个整数动态分配内存(由一个类成员指向 _pPtrMem),并在析构函数中释放该整数。为了避免浅拷贝,我重载了赋值运算符和拷贝构造函数。重载赋值运算符的广泛使用方式如下:

A& operator = (const A & iToAssign)
{
if (this == & iToAssign) // Check for self assignment
return *this;
int * pTemp = new int(*(iToAssign._pPtrMem)); // Allocate new memory with same value
if (pTemp)
{
delete _pPtrMem; // Delete the old memory
_pPtrMem = pTemp; // Assign the newly allocated memory
}
return *this; // Return the reference to object for chaining(a = b = c)
}

另一种实现方式是

A& operator = (const A & iToAssign)
{
*_pPtrMem= *(iToAssign._pPtrMem); // Just copy the values
return *this;
}

既然第二个版本相对简单和快速得多(没有释放,分配内存)为什么它没有被广泛使用?有什么我无法解决的问题吗?

此外,我们还从赋值运算符返回一个相同类型的对象以进行链接(a = b = c)...所以不是返回 *this 是否可以返回 iToAssign 对象,因为这两个对象现在应该是相等的?

最佳答案

通常,实现复制赋值运算符的最佳方法是为您的类提供一个 swap() 函数(或者使用标准函数,如果它能满足您的需求),然后实现复制通过复制构造函数的赋值运算符:

A& A::operator= (A iToAssign)  // note pass by value here - will invoke copy constructor
{
iToAssign.swap(*this);
return *this;
}
// void swap(A& other) throws() // C++03
void A::swap(A& other) noexcept
{
std::swap(_pPtrMem, other._pPtrMem);
}

这确保您的复制赋值运算符和复制构造函数永远不会分歧(也就是说,不会发生您更改一个而忘记更改另一个的情况)。

关于c++ - 重载 C++ 赋值运算符的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15355919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com