C++初始化列表实现方法详解

C++编程语言应用范围非常广泛,而且应用方式灵活,在一定程度上提高了编程人员的开发效率。那么接下来,我们就可以通过以下对C++初始化列表的相关实现方法的掌握,来初步了解这一语言的应用技巧。

创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于网站制作、成都网站制作、库车网络推广、微信平台小程序开发、库车网络营销、库车企业策划、库车品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供库车建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com

先看下面这段程序

 
 
 
  1. #include < iostream> 
  2. #include < vector> 
  3. using namespace std;  
  4. class array  
  5. {  
  6. public:  
  7. array(int lowbound, int highbound);  
  8. vector< int> data;  
  9. int size;  
  10. int lbound, hbound;  
  11. };  
  12. array::array(int lowbound, int highbound):  
  13. size(highbound-lowbound+1),  
  14. lbound(lowbound),hbound(highbound),  
  15. data(size){}  
  16. int main()  
  17. {  
  18. array a(0,10);  
  19. cout < <  a.size < <  '\n';  
  20. cout < <  a.data.size() < <  '\n';  

这段程序看不出什么问题,至少一开始我看不出什么问题,但是运行的结果让我吃惊,vector< int> data的长度是一个不确定的大小。

许多人都会说,在函数的C++初始化列表中进行了初始化了么?怎么还会没有长度大小呢!其实是我们忽略了构造函数懂初始化列表的游戏规则,构造函数初始化的顺序并不是按照我们看到的在构造函数后面写的顺序,而是按照成员变量在类中的定义的顺序,所以上面

 
 
 
  1. array::array(int lowbound, int highbound):   
  2. size(highbound-lowbound+1),  
  3. lbound(lowbound),hbound(highbound),   
  4. data(size){} 

的运行顺序是按照下面的代码的实现顺序:

 
 
 
  1. array::array(int lowbound, int highbound):  
  2. data(size),size(highbound-lowbound+1),  
  3. lbound(lowbound),hbound(highbound) {}  

所以当运行data(size)的时候,size还没有定义,所以在后面的测试程序中输出的data.size()的时候,就输出了一个不确定的数。

那么C++为什么要这么做呢?

我们知道,对一个对象的所有成员来说,它们的析构函数被调用的顺序总是和它们在构造函数里被创建的顺序相反。那么,如果允许上面的情况(即,成员按它们在初始化列表上出现的顺序被初始化) 发生,编译器就要为每一个对象跟踪其成员初始化的顺序,以保证它们的析构函数以正确的顺序被调用。这会带来昂贵的开销。所以,为了避免这一开销,同一种类型的所有对象在创建(构造)和摧毁(析构)过程中对成员的处理顺序都是相同的,而不管成员在C++初始化列表中的顺序如何。

【编辑推荐】

  1. C++多态性基本概念讲述
  2. C++获得系统时间具体实现代码解析
  3. 自定函数实现C++读取CSV文件
  4. C++ explicit关键字应用于构造函数
  5. 讲述C++中调用Python脚本

分享标题:C++初始化列表实现方法详解
当前路径:http://www.shufengxianlan.com/qtweb/news26/79576.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联