C++构造函数中初始化成员的先后顺序

给定一个类,我们都知道,类的构造函数是用来初始化类中的成员的。那么类中成员变量初始化的先后顺序是依据什么确定的呢?

看下面一段程序:

#include<iostream>
using namespace std;
class A
{
	int a;
	int b;
public:
	A() :b(0), a(b + 2){	}
	void print()
	{
		cout << "a = " << a << " ,b = " << b << endl;
	}
};
int main()
{
	A a;
	a.print();
	return 0;
}
结果:


根据结构分析,a是一个地址,并没有被初始化。b=0说明b被成功初始化了。为什么会有这样的结果呢,只有一个原因是a先被初始化,之后b才被初始化。(如果b先被初始化,a的值应该为2)

那么C++中成员变量初始化的次序与什么相关呢?

答案是:类中成员变量初始化的先后次序与变量在类中被定义的先后次序有关。从类定义可一个看出我们先定义了a,然后定了b。这样的话在constructor中会先初始化成员变量a,再初始化b。

因此,只要我们将类中int b;放在int a;前就可以达到预期效果:a = 2, b = 0

一句话说,类中成员变量被初始化的顺序与成员变量在类中声明的先后顺序一致。与构造函数中被初始化的先后顺序无关。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++构造函数初始化可以通过以下几种方式实现: 1. 利用成员初始化列表进行初始化成员初始化列表是构造函数的一部分,用于初始化类中成员变量。它在构造函数体之前执行,语法如下: ``` ClassName::ClassName(参数列表) : 成员变量1(值1), 成员变量2(值2), ... { // 构造函数体 } ``` 例如: ``` class Person { public: Person(string name, int age) : _name(name), _age(age) { // 构造函数体 } private: string _name; int _age; }; ``` 2. 在构造函数体内进行初始化。 在构造函数体内,可以使用赋值语句对成员变量进行初始化,例如: ``` ClassName::ClassName(参数列表) { 成员变量1 = 值1; 成员变量2 = 值2; ... } ``` 例如: ``` class Person { public: Person(string name, int age) { _name = name; _age = age; } private: string _name; int _age; }; ``` 需要注意的是,在使用赋值语句进行初始化成员变量初始化顺序与它们在类中的声明顺序有关,而不是与它们在构造函数的出现顺序有关。因此,最好还是使用成员初始化列表进行初始化。 3. 使用默认构造函数进行初始化。 如果类中成员变量都有默认构造函数,那么可以不进行初始化,而是使用默认构造函数进行初始化,例如: ``` class Person { public: // 使用默认构造函数进行初始化 private: string _name; int _age; }; ``` 需要注意的是,默认构造函数只能对成员变量进行默认初始化,即将其设置为默认值。如果需要进行其他型的初始化,还是需要使用成员初始化列表或在构造函数体内进行初始化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值