首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >成员变量可以访问相同初始化列表(C++)中先前定义的成员变量的值吗?

成员变量可以访问相同初始化列表(C++)中先前定义的成员变量的值吗?
EN

Stack Overflow用户
提问于 2018-11-08 22:43:14
回答 3查看 82关注 0票数 2

例如:

代码语言:javascript
运行
复制
Cls::Cls(int *p) : m1_(1), m2_(m1), m3_(p), m4_(m3) {}

其中Cls::m1_Cls::m2_int型,m3m4int*型。

这合法吗?如果它是合法的,它会做人们期望的事情吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-08 22:54:34

正如注释中所指出的,非静态数据成员是按声明顺序初始化的。为了避免混淆,您应该始终按声明顺序写入成员初始化器。因此,就问题所述的情况而言,我假定宣布议员的次序如下:

代码语言:javascript
运行
复制
int m1_;
int m2_;
int* m3_;
int* m4_;

假设是这样的话,代码就会被很好地定义,并按照您的期望来做。它保证每个成员初始化都是一个完整表达式,而class.base.init/13.3保证这些初始化按声明顺序进行。

票数 2
EN

Stack Overflow用户

发布于 2018-11-08 22:48:52

是的,是合法的。init顺序遵循类中成员的顺序。

代码语言:javascript
运行
复制
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;
}

产出:

代码语言:javascript
运行
复制
1
2
4
7

但是如果你修改了会员的命令:

代码语言:javascript
运行
复制
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;
};

产出如下:

代码语言:javascript
运行
复制
1
1
3
6
票数 3
EN

Stack Overflow用户

发布于 2018-11-08 22:54:41

这是合法的。如果你有

代码语言:javascript
运行
复制
struct foo
{
    int a;
    int b;
    int c;
    foo() : a(1), b(a + 1), c(b + 1) {}
};

那这就没问题了。原因是a是在b之前在类中声明的,b是在c之前声明的。所有类成员都按照类中声明的顺序初始化,因此您甚至可以使用

代码语言:javascript
运行
复制
struct foo
{
    int a;
    int b;
    int c;
    foo() : c(b + 1), b(a + 1), a(1) {}
};

你还是会没事的。如果你有

代码语言:javascript
运行
复制
struct foo
{
    int b;
    int c;
    int a;
    foo() : a(1), b(a + 1), c(b + 1) {}
};

另一方面,bc都将使用不确定值初始化,使用它们将是未定义的行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53217258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档