引用初始化为类的成员
Reference initialization as member of class
我有类"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++) { }
用于构造Segment
的Points
必须与Segment
一样长时间地保持,因为它保持对它的引用
Point(start.x(), start.y())
将构造一个新的(临时的)Point
对象,但使用它来初始化引用是无效的,因为临时对象立即超出范围。
相关文章:
- C++成员初始化
- c++构造函数成员初始化:传递参数
- C++正确的指针成员初始化
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- WinLamb 错误:成员初始化非法
- 使用其他成员初始化结构的成员?
- C++模板类静态成员初始化
- 解释了构造函数成员初始化列表
- 如何在成员初始化列表中声明共享指针
- C++入门5版:使用get成员初始化另一个与shared_ptr无关的对象
- C++11 默认类成员初始化与初始值设定项列表同时
- 调用非默认构造函数作为成员初始化
- C++模板成员初始化:用右值移动构造,但用左值移动引用
- 类成员初始化C++
- 在成员初始化列表中,我可以创建对列表中不在列表中的成员变量的引用
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 如何调用成员初始化器列表中参考成员的构造函数
- C 构造函数采用成员初始化器
- 与其他静态const成员初始化静态常量成员
- 静态内联成员初始化顺序