例如:
Cls::Cls(int *p) : m1_(1), m2_(m1), m3_(p), m4_(m3) {}
其中Cls::m1_
和Cls::m2_
为int
型,m3
和m4
为int*
型。
这合法吗?如果它是合法的,它会做人们期望的事情吗?
发布于 2018-11-08 22:54:34
正如注释中所指出的,非静态数据成员是按声明顺序初始化的。为了避免混淆,您应该始终按声明顺序写入成员初始化器。因此,就问题所述的情况而言,我假定宣布议员的次序如下:
int m1_;
int m2_;
int* m3_;
int* m4_;
假设是这样的话,代码就会被很好地定义,并按照您的期望来做。它保证每个成员初始化都是一个完整表达式,而class.base.init/13.3保证这些初始化按声明顺序进行。
发布于 2018-11-08 22:48:52
是的,是合法的。init顺序遵循类中成员的顺序。
struct C
{
C() : m1_(1), m2_(m1_ + 1), m3_(m2_ + 2), m4_(m3_ + 3) {}
int m1_ = 0;
int m2_ = 0;
int m3_ = 0;
int m4_ = 0;
};
int main()
{
C c;
std::cout << c.m1_ << std::endl;
std::cout << c.m2_ << std::endl;
std::cout << c.m3_ << std::endl;
std::cout << c.m4_ << std::endl;
}
产出:
1
2
4
7
但是如果你修改了会员的命令:
struct C
{
C() : m1_(1), m2_(m1_ + 1), m3_(m2_ + 2), m4_(m3_ + 3) {}
int m2_ = 0;
int m3_ = 0;
int m4_ = 0;
int m1_ = 0;
};
产出如下:
1
1
3
6
发布于 2018-11-08 22:54:41
这是合法的。如果你有
struct foo
{
int a;
int b;
int c;
foo() : a(1), b(a + 1), c(b + 1) {}
};
那这就没问题了。原因是a
是在b
之前在类中声明的,b
是在c
之前声明的。所有类成员都按照类中声明的顺序初始化,因此您甚至可以使用
struct foo
{
int a;
int b;
int c;
foo() : c(b + 1), b(a + 1), a(1) {}
};
你还是会没事的。如果你有
struct foo
{
int b;
int c;
int a;
foo() : a(1), b(a + 1), c(b + 1) {}
};
另一方面,b
和c
都将使用不确定值初始化,使用它们将是未定义的行为。
https://stackoverflow.com/questions/53217258
复制相似问题