为什么会这样? operator =和复制构造函数

时间:2014-12-13 15:45:29

标签: c++ constructor operator-overloading

我有以下课程:

class CRectangle
{
    CRectangle(string color);
    CRectangle(CRectangle &origin);
    /* Some more code */
};

和另一个:

class CPlane
{
    /* Some more code */
    CRectangle boundingBox();
};

为什么我能做到这一点? :

CRectangle rectangle1;
CRectangle rectangle2=rectangle1;
CRectangle rectangle3(rectangle1); //Copy constructor.

但我不能这样做:

CPlane plane;
CRectangle rectangle4=plane.boundingBox();
CRectangle rectangle5(plane.boundingBox()); //Copy constructor.

如果我需要最后一项工作,我该怎么办呢?我想这可能与运营商=有关,但我不确切知道。

编辑:修复复制构造函数。错误仍然存​​在。

2 个答案:

答案 0 :(得分:5)

复制构造函数请求编译器的第一个语法,用于无限递归。

应该是: -

CRectangle(const CRectangle& origin);

其次,两个调用都应该正常工作,因为两者都是复制constrcutor的调用。

CRectangle rectangle4=plane.boundingBox();
CRectangle rectangle5(plane.boundingBox()); 

答案 1 :(得分:3)

您无法将rvalues绑定到非const左值引用。

CRectangle rectangle3(rectangle1);

此处rectangle1是非const左值,所以很好。

CRectangle rectangle5(plane.boundingBox());

plane.boundingBox()是纯粹的右值(prvalue),因此CRectangle&无法绑定它。

而是声明您的复制构造函数采用const引用:

CRectangle(CRectangle const&);

或者另外声明一个移动构造函数(如果需要)。