在下面的例子中,我有两个类,第一个类动态分配一个整数,第二个类是第一个类的容器。
当我对两个容器对象(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;
}