类定义中的引用变量

时间:2011-02-19 09:06:51

标签: c++ reference

我正在学习C ++,并且我读到必须在声明时初始化所有引用, 并且没有“未初始化的参考”。但是如果引用变量是类成员呢?

class test
{
    int &k;
};

int main()
{
    test *abc = new test;
}

该程序编译并正常运行(以g ++为单位,没有警告)。但是,abc->k是一个引用,但它初始化为什么?或者,它是某种“未初始化的参考”还是别的什么?

3 个答案:

答案 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的堆栈帧从堆栈中取出时,引用将不再有效。