C++成员变量的初始化顺序问题

先来看两道题:

// count algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::count
#include <vector>       // std::vector
using namespace std;
class A {
public:
	A() { cout << "in A()" << endl; }
};

class B {
public:
	B() { cout << "in B()" << endl; }
	B(int i) { cout << "in B(int i)" << endl; }
};

class C {
public:
	C() { cout << "in C()" << endl; }
};

class CC : public C {
public:
	CC() :b(10) { cout << "in CC()" << endl; }
public:
	A a;
	B b;
};

int main()
{

	CC c;

	return 0;
}


答案:

in C()
in A()
in B(int i)
in CC()
请按任意键继续. . .

再看另一道题:

// count algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::count
#include <vector>       // std::vector
using namespace std;
class A
{
private:
	int n1;
	int n2;

public:
	A() :n2(0), n1(n2 + 2){}

	void Print(){
		cout << "n1:" << n1 << ", n2: " << n2 << endl;
	}
};

int main()
{

	A a;
	a.Print();

	return 1;
}

答案:

n1:-858993458, n2: 0
请按任意键继续. . .

若改成:

// count algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::count
#include <vector>       // std::vector
using namespace std;
class A
{
private:
	int n1;
	int n2;

public:
	A() {
		n2 = 0;
		n1 = n2 + 2;
	}

	void Print(){
		cout << "n1:" << n1 << ", n2: " << n2 << endl;
	}
};

int main()
{

	A a;
	a.Print();

	return 1;
}


答案:

n1:2, n2: 0
请按任意键继续. . .


上面的例子告诉了我们一个事实:

类的初始化顺序:基类--->成员------->构造函数内部

具体是:

1.先给基类分配内存

2.按照定义的先后顺序初始化列表

3.进入类构造函数后执行构造函数内部的代码

而且类成员变量的初始化顺序以成员在类中的声明为序, 而不管它在初始化成员列表的出现顺势。

 因此:

我们看第一个例子:

CC继承自C,因此先调用C的构造函数,输出“in C()

然后CC中含有A,B两个成员类,按照先后次序,分别初始化,调用A,B的构造函数,由于B有参数传递,所以调用显式构造函数:

in A()
in B(int i)
最后执行CC构造函数内部的代码

in CC()

第二个例子:

int n1;
int n2;

public:
	A() :n2(0), n1(n2 + 2){}
定义时,规定了n1在前,n2在后,所以在初始化时亦执行此顺序。故出现:

n1:-858993458, n2: 0

后面做了改造,则直接执行函数内部的代码,按照顺序,所以结果:

n1:2, n2: 0







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值