C++:两个自定义对象的和,避免复制构造函数的双重调用



在下面的例子中,我有两个类,第一个类动态分配一个整数,第二个类是第一个类的容器。

当我对两个容器对象(operator+()(求和时,复制构造函数被调用两次。在我看来,第二次发生在";返回";CCD_ 2函数的语句。如何优化以避免第二次调用复制构造函数

显然,这对于更复杂的应用程序来说是有代表性的,在这些应用程序中,如果逻辑上只需要创建一个对象来计算总和(然后返回(,我不想做两个深度复制:

(看起来可能有很多代码,但只有运算符和构造函数才能有效地求和。我避免了析构函数,以免它更加混乱(。

主要类别

int main()
{
NumberContainer a{1};
NumberContainer b{2};
NumberContainer c = a + b; // Copy constructor called twice!
return 0;
}

号码类别:

class Number
{
public:
int* num;
Number(int num) : num{new int{num}}
{}
// Destructor...
};

集装箱类别:

class NumberContainer
{
private:
Number _numObj;
public:
NumberContainer(int num) : _numObj{Number{num}}
{}
NumberContainer(const NumberContainer& source) : NumberContainer{*(source._numObj.num)}
{
std::cout<<"Copy constructor called" << std::endl;
}
NumberContainer(NumberContainer&& source) : NumberContainer(*(source._numObj.num))
{
std::cout<<"Move constructor called" << std::endl;
}
NumberContainer& operator=(const NumberContainer& source)
{
*(_numObj.num) = *(source._numObj.num);
std::cout<<"Copy assignment called" << std::endl;
return *this;
}
NumberContainer& operator=(NumberContainer&& source)
{
_numObj.num = source._numObj.num;
source._numObj.num = nullptr;
std::cout<<"Move assignment called" << std::endl;
return *this;
}
NumberContainer& operator+=(const NumberContainer& source)
{
*(_numObj.num) += *(source._numObj.num);
return *this;
}
NumberContainer operator+(const NumberContainer& source) const
{
NumberContainer copy{*this};
return copy+=source;
}
// Destructor...
};

在运算符+中创建一个中间对象没有什么意义。

NumberContainer operator+(const NumberContainer& source) const
{
NumberContainer copy{*this};
return copy+=source;
}

像一样定义它

NumberContainer operator+(const NumberContainer& source) const
{
return     *(_numObj.num) + *(source._numObj.num);
}

复制构造函数也可以像一样定义

NumberContainer(const NumberContainer& source) : _numObj{*(source._numObj.num)}
{
std::cout<<"Copy constructor called" << std::endl;
}

最新更新