是否可以直接在c ++中的另一个构造函数的参数中构造对象?

时间:2016-11-16 17:15:51

标签: c++ constructor instantiation

我对c ++很陌生,想知道是否可以这样做:

Rectangle rect(Point(0, 0), 10, 10); // doesn't work

这个想法是Rectangle获取Point对象以及width和height参数。构造函数看起来像这样:

Rectangle::Rectangle(Point & point, double width, double height) {
  this->point = point;
  this->width = width;
  this->height = height;
};

Point::Point(double x, double y) {
  this->x = x;
  this->y = y;
};

通过这样做我可以获得预期的效果:

Point point(0, 0);
Rectangle rect(point, 10, 10); // this works

但我认为如果我可以直接在新矩形的参数中实例化我的观点会很好。如果可以,请告诉我!谢谢!

3 个答案:

答案 0 :(得分:2)

“常规”引用不能绑定到临时的,只有常量引用(const T&)和r值引用(T&&

在您的第一个代码段中,Point(0, 0)是临时的,因此无法绑定到Point&,但在您的第二个代码段中,Point point(0, 0);不是临时的,因此它可以正常工作

在这种情况下,由于您不尝试修改临时,因此将其绑定到常量引用:

Rectangle::Rectangle(const Point & point, double width, double height)

答案 1 :(得分:0)

这取决于Rectangle的定义方式。

我假设它看起来像这样:

class Rectangle {
    Point point;
    double width, height;
    /*...*/
};

在这种情况下,定义像这样的构造函数将起作用:

Rectangle::Rectangle(Point const& p, double w, double h) {
    point = p;
    width = w;
    height = h;
}

这将允许它采取临时(如你所愿)或采取左值(这是你的第二个例子)。

如果Rectangle旨在将引用存储到某个点,那几乎肯定是设计错误,您应该更改它。

答案 2 :(得分:0)

您可以在参数列表中进行实例化,但不会在构造函数外部使用Point。该点将是构造函数的本地。

之后您可以以rect.point的身份访问该点。

编辑:

由于您尝试使用引用指向,因此无效。