由于我的代码中存在错误,我遇到了这个问题,我很好奇为什么允许它。是什么原因允许对象成员在构造函数初始化列表中可见?
#include <stdio.h>
class derived {
private:
int * value2;
public:
derived();
};
derived::derived()
: value2(value2){} // Uninitialized self-assignment
int main()
{
derived thisChild;
}
Clang对此发出了警告,但不幸的是g ++没有。
答案 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)
我认为你的意思是为什么在初始化表达式中可以访问成员变量。
一个原因是一个成员变量的初始化可能依赖于另一个成员变量。
这很脆弱,但有时需要避免像人工基类这样的尴尬代码。