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

问题来源:

《剑指offer》中,考官出了一道简单的程序输出结果值的题,如下:


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。

在我电脑输出结果为:
在这里插入图片描述
如果你也这样回答,那么你肯定不懂初始化成员列表的顺序。

如果我把A类中构造函数改成:

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

那么此时输出结果为:
在这里插入图片描述
分析:

  1. 成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。因为成员变量的初始化次序是根据变量在内存中次序有关,而内存中的排列顺序早在编译期就根据变量的定义次序决定了。这点在EffectiveC++中有详细介绍。

  2. 如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。

  3. 注意:类成员在定义时,是不能初始化的

  4. 注意:类中const成员常量必须在构造函数初始化列表中初始化。

  5. 注意:类中static成员变量,必须在类外初始化。

  6. 静态变量进行初始化顺序是基类的静态变量先初始化,然后是它的派生类。直到所有的静态变量都被初始化。这里需要注意全局变量和静态变量的初始化是不分次序的。这也不难理解,其实静态变量和全局变量都被放在公共内存区。可以把静态变量理解为带有“作用域”的全局变量。在一切初始化工作结束后,main函数会被调用,如果某个类的构造函数被执行,那么首先基类的成员变量会被初始化。

//bbb的成员变量定义:
private:
	int n1;
	int n2;
//bbb的构造函数:
bbb::bbb():n2(1),n1(2)
{
}

汇编代码:

00401535 mov eax,dword ptr [ebp-4]
00401538 mov dword ptr [eax+4],2
0040153F mov ecx,dword ptr [ebp-4]
00401542 mov dword ptr [ecx+8],1

转载自:https://www.jb51.net/article/106481.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态成员是指在类中使用static关键字声明的成员。它们不依赖于类的实例化,而是与类本身相关联。静态成员具有以下几个特点: 1. 静态成员属于类,而不属于类的实例。这意味着无论创建多少个类的实例,静态成员只有一个副本,被所有实例共享。 2. 静态成员可以直接通过类名访问,而无需实例化类对象。例如,可以通过ClassName.staticMember的形式来访问静态成员。 3. 静态成员在类的初始化阶段被创建,并在整个程序的执行过程中存在。它们会在程序启动时进行初始化,直到程序结束时才会被销毁。 4. 静态成员可以访问类的非静态成员,但非静态成员无法直接访问静态成员。这是因为静态成员的存在不依赖于类的实例,而非静态成员的访问需要通过实例化类对象。 5. 静态成员可以用于共享数据或者统计类的实例个数等功能。例如,可以使用一个静态成员变量来记录类的实例数目。 需要注意的是,静态成员在内存中只有一份副本,如果对静态变量进行修改,那么这个修改会对所有实例产生影响。此外,静态成员还可以通过静态成员函数来访问和修改,这些静态成员函数也不依赖于类的实例。 总之,静态成员是与类相关联的成员,具有独特的访问方式和生命周期。它们在编写程序时具有一定的灵活性和实用性,可以用于共享数据和实现功能的统计等方面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值