请选择 进入手机版 | 继续访问电脑版

C++编程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2013|回复: 1

C++类构造函数初始化列表执行顺序

[复制链接]

8

主题

31

帖子

323

积分

版主

Rank: 7Rank: 7Rank: 7

积分
323
QQ
发表于 2016-8-5 12:17:30 | 显示全部楼层 |阅读模式
说到C++类构造函数初始化列表执行顺序得先说说什么叫C++类构造函数初始化列表,直接上代码,以下代码就是C++类构造函数初始化列表。


  1.     class A  
  2.     {  
  3.     private:  
  4.         int n1;  
  5.         int n2;  
  6.          
  7.     public:  
  8.         A() :n1(0), n2(0)  
  9.         {  
  10.       
  11.         }  

复制代码

以上代码中的类 A的构造函数中  n1与n2就叫C++类构造函数初始化列表,代码初始化了n1与n2
那么为什么会有C++类构造函数初始化列表执行顺序这个问题呢,原因是今天有好友在群(群号:125101150)里发了一面试题,说实在话,搞了很久C++的人都不一定会做这题(当然我也不会:))。下面来看看
这个面试题(图片太小,可以将图片另存为,再放大看)


图片中代码片段



  1.     class A  
  2.     {  
  3.     private:  
  4.         int n1;  
  5.         int n2;  
  6.          
  7.     public:  
  8.         A() :n2(0), n1(n2+2)  
  9.         {  
  10.       
  11.         }  
  12.       
  13.         void Print()  
  14.         {  
  15.             std::cout << n1 << " " << n2;  
  16.         }  
  17.     };  

复制代码

问题是执行Print后输出n1与n2值是多少.. 很多人会说,n2=0 n1=2 如果这样回答,那就是错的。初始化顺序不是从左向右的。
这时又会有人说,C++类构造函数初始化列表执行顺序是从右向左的,刚试了代码n1是随机数,n2是0.这样回答好像感觉挺对的,
我开始试的时候也认为是从右向左,但结果是错的,不信可以加一个n3去试.以下是n3的执行结果图



                                      
        
      

      
   

                                                            说到C++类构造函数初始化列表执行顺序得先说说什么叫C++类构造函数初始化列表,直接上代码,以下代码就是C++类构造函数初始化列表。
复制内容到剪贴板
  • class A  
  • {  
  • private:  
  •     int n1;  
  •     int n2;  
  •       
  • public:  
  •     A() :n1(0), n2(0)  
  •     {  
  •   
  •     }  


以上代码中的类 A的构造函数中  n1与n2就叫C++类构造函数初始化列表,代码初始化了n1与n2
那么为什么会有C++类构造函数初始化列表执行顺序这个问题呢,原因是今天有好友在群(群号:125101150)里发了一面试题,说实在话,搞了很久C++的人都不一定会做这题(当然我也不会:))。下面来看看
这个面试题(图片太小,可以将图片另存为,再放大看)


图片中代码片段
复制内容到剪贴板
  • class A  
  • {  
  • private:  
  •     int n1;  
  •     int n2;  
  •       
  • public:  
  •     A() :n2(0), n1(n2+2)  
  •     {  
  •   
  •     }  
  •   
  •     void Print()  
  •     {  
  •         std::cout << n1 << " " << n2;  
  •     }  
  • };  


问题是执行Print后输出n1与n2值是多少.. 很多人会说,n2=0 n1=2 如果这样回答,那就是错的。初始化顺序不是从左向右的。
这时又会有人说,C++类构造函数初始化列表执行顺序是从右向左的,刚试了代码n1是随机数,n2是0.这样回答好像感觉挺对的,
我开始试的时候也认为是从右向左,但结果是错的,不信可以加一个n3去试.以下是n3的执行结果图


从图中可以看到如果从右向左执行的话n1是会等于n3的,但n1没有等于n3,所以执行顺序不是从右向左.
总结出来的结论是:对成员变量的初始化,是严格按照声明次序,而不是在初始化列表中的顺序进行初始化
大家一定要记住啊。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
VC纵横、磐实编程网
回复

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
发表于 2017-6-22 18:16:28 | 显示全部楼层
刚才在别的群里面看到一个人问这个问题,发现了一个现象,g++似乎跟VS的初始化顺序相反。特别记录一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|C++编程  

GMT+8, 2019-7-22 20:30 , Processed in 0.109375 second(s), 35 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表