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

开发 后端
C++初始化列表的实现方法将会在这篇文章中详尽给出。希望刚刚接触C++语言的朋友们能够通过阅读本文后充分的掌握这一应用技巧。

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

先看下面这段程序

  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脚本
责任编辑:曹凯 来源: 博客园
相关推荐

2023-11-12 23:08:17

C++初始化

2024-03-13 08:52:43

C++初始化方式

2009-09-02 16:52:55

C#数组初始化

2010-02-06 14:40:50

C++初始化和赋值

2009-08-28 11:43:26

C#数组初始化

2009-08-28 11:24:48

C#一维数组初始化

2021-06-09 09:49:35

C++RAII语言

2010-02-06 15:58:10

C++集合初始化

2010-02-05 17:16:05

C++构造函数

2011-06-09 14:13:06

C++JAVA缺省初始化

2021-12-26 00:08:35

C++初始化列表

2009-08-31 09:47:22

C#静态变量初始化

2023-10-06 20:57:52

C++聚合成员

2010-02-03 11:01:18

C++类静态成员初始化

2009-08-31 10:38:34

C#变量初始化

2010-01-22 15:47:37

VB.NET初始化网格

2023-12-04 10:57:52

函数C++

2009-09-18 11:15:52

C#数组初始化

2009-07-31 17:51:27

C#对象初始化

2009-12-16 14:04:04

Ruby对象初始化
点赞
收藏

51CTO技术栈公众号