为什么会这样?运算符= 和复制构造函数

why is this happening ? operator= and copy constructor

本文关键字:复制 构造函数 运算符 为什么      更新时间:2023-10-16

我有以下类:

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.

如果我需要我最后一个工作,我该怎么做?我想这可能与操作员=有关,但我并不确切知道。

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

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

它应该是:-

CRectangle(const CRectangle& origin);

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

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

不能将右值绑定到非const左值引用。

CRectangle rectangle3(rectangle1);

这里的rectangle1是一个非const的左值,所以这很好。

CRectangle rectangle5(plane.boundingBox());

plane.boundingBox()是一个纯右值(prvalue(,因此CRectangle&不能绑定到它。

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

CRectangle(CRectangle const&);

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