2

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

#include <stdio.h>

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

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

int main()
{
  derived thisChild;
}

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

4

4 回答 4

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
    {}
};

允许这样做并禁止您的示例将是相当棘手的。

于 2012-06-18T17:42:26.800 回答
2

如果它不可见,则不能这样写:

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

那么成员初始化列表的意义何在?

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

int xyz = xyz; //will compile
于 2012-06-18T17:41:37.720 回答
0

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

此外,您可能希望重用已创建的成员变量来初始化其他变量——注意:您必须知道初始化的确切顺序(成员变量声明的顺序),以确保您使用的是可移植的

于 2012-06-18T17:40:54.290 回答
0

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

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

这很脆弱,但有时需要避免笨拙的代码,例如人工基类。

于 2012-06-18T17:43:20.823 回答