为什么成员变量在c ++构造函数初始化列表中可见?

时间:2012-06-18 17:38:04

标签: c++ initializer-list

由于我的代码中存在错误,我遇到了这个问题,我很好奇为什么允许它。是什么原因允许对象成员在构造函数初始化列表中可见?

#include <stdio.h>

class derived {
  private:
    int * value2;
  public:
    derived();
};

derived::derived()
 : value2(value2){} // Uninitialized self-assignment

int main()
{
  derived thisChild;
}

Clang对此发出了警告,但不幸的是g ++没有。

4 个答案:

答案 0 :(得分:3)

所以你可以使用另一个成员来推动一个成员;如果另一个已经初始化,或者你只是使用它的地址来初始化指针或引用,这是完全正常的。例如:

struct Thingy
{
    int & r;
    int a;
    int b;

    Thingy(int x) :
        r(a),   // OK - a has a valid address, and we're not using the value
        a(x),
        b(a)    // OK - a has been initialised
    {}
};

允许这样做并且不允许你的例子是相当棘手的。

答案 1 :(得分:2)

如果不可见,则不能写下:

A(int n) : some_num(n), another_num(some_num*10) {}

然后成员初始化列表的重点是什么?

至于自我初始化(未初始化的变量),您甚至可以这样做:

int xyz = xyz; //will compile

答案 2 :(得分:0)

您可以将初始化列表视为方法主体(特别是构造函数)的一部分,因此您可以在其中一个方法中访问对象的成员变量

此外,您可能希望重用已创建的成员变量来初始化其他人 - note :您必须知道初始化的确切顺序(成员变量声明的顺序)以确保您正在使用这个便携式

答案 3 :(得分:0)

我认为你的意思是为什么在初始化表达式中可以访问成员变量。

一个原因是一个成员变量的初始化可能依赖于另一个成员变量。

这很脆弱,但有时需要避免像人工基类这样的尴尬代码。