引用初始化为类的成员

Reference initialization as member of class

本文关键字:成员 初始化 引用      更新时间:2023-10-16

我有类"Segment":

class Segment
{
private:
    Point &_a;
    Point &_b;
public:
    Segment(const Point& start, const Point& end);
    ~Segment(); 
};

这是构造函数的实现:

Segment::Segment(const Point& start, const Point& end): 
    _a(Point(start.x(), start.y())), 
    _b(Point(end.x(), end.y())), 
    _segmentID(_freeID++)
    {
        return;
    }

它符合警告:

警告C4413:引用成员被初始化为临时成员,该临时成员在构造函数退出后不会持久存在

如何正确初始化类构造函数中的引用?如何消除此警告?

附言:这是另一个有同样问题的构造函数:

Segment::Segment(double x1, double y1, double x2, double y2): 
    _a(Point(x1, y1)), 
    _b(Point(x2, y2)),
    _segmentID(_freeID++)
    {
        return;
    }

您的问题是这个。

Segment::Segment(const Point& start, const Point& end): 
    _a(Point(start.x(), start.y())), 
    _b(Point(end.x(), end.y())), 
    _segmentID(_freeID++)
    {
        return;
    }

在初始值设定项列表中,您正在创建一个临时对象。

Point(start.x(), start.y())

一旦在其中创建的作用域退出,这个临时对象就会被销毁,这就是您所引用的错误消息告诉您的。

您可以将初始值设定项更改为以下内容:

Segment::Segment(Point& start, Point& end): 
    _a(start), 
    _b(end), 
    _segmentID(_freeID++)
    {
    }

问题是_a和_b的生存期超出了您的控制范围。如果这些是基于堆栈的变量,那么当对象仍然依赖它们作为有效变量时,它们可能会被销毁。

此外,构造函数的返回毫无意义。

Segment::Segment(const Point& a, const Point& b) :
    _a(a), _b(b), _segmentID(_freeID++) { }

用于构造SegmentPoints必须与Segment一样长时间地保持,因为它保持对它的引用

Point(start.x(), start.y())将构造一个新的(临时的)Point对象,但使用它来初始化引用是无效的,因为临时对象立即超出范围。