我正在学习C ++,并且我读到必须在声明时初始化所有引用, 并且没有“未初始化的参考”。但是如果引用变量是类成员呢?
class test
{
int &k;
};
int main()
{
test *abc = new test;
}
该程序编译并正常运行(以g ++为单位,没有警告)。但是,abc->k
是一个引用,但它初始化为什么?或者,它是某种“未初始化的参考”还是别的什么?
答案 0 :(得分:8)
该程序格式错误,因为它构造了一个无法初始化引用类型的非静态成员实体的类。
我相信gcc应该无法编译这个,但是我只在没有构造函数的类中收到警告“非静态引用'int& test :: k'。”
test
是非POD结构类型,因为它包含引用成员。 (9 [class] / 4)
new test
默认初始化动态分配的类。 (5.3.4 [expr.new] / 15)
default-initialize 类型为test
的对象意味着调用隐式声明和隐式定义的默认构造函数。 (8.5 [dcl.init] / 5)
隐式定义的默认构造函数等效于具有空 mem-initialized-list 和空函数体的默认构造函数。 (12.1 [class.ctor] / 7)
更多:
隐式定义的默认构造函数执行的初始化集合 将由具有空 mem-initializer-list (12.6.2)和空函数体的该类的用户编写的默认构造函数执行的类。如果用户编写的默认构造函数不正确,则程序格式不正确。
如果实体不是 mem-initializer-list 中的名称,并且该成员不属于类[具有进一步限制],则该实体不会被初始化。
否则,实体未初始化。如果实体是const限定类型,或引用类型,[或...]程序格式不正确。“(12.6.2 [class.base.init] / 4)< / p>
答案 1 :(得分:1)
您的代码实际上根本不会在Visual C ++上编译。一般来说,最好尽可能少地留下机会。您需要使用构造函数中的初始化列表初始化refence成员:
class test
{
public:
test(int& x) : k(x)
{
}
int& k;
};
答案 2 :(得分:1)
class test
{
public:
test(int x) : k(x)
{
}
int& k;
};
我怀疑引用的初始化方式。当ctr的堆栈帧从堆栈中取出时,引用将不再有效。