C++集合初始化基本概念概述

开发 后端
C++集合初始化的应用在实际程序开发中应用非常频繁,对于这样一个基础应用技术,我们需要在学习的过程中加强关注度。

C++编程语言中有很多比较重要的概念,需要我们不断的去学习。比如今天为大家介绍的C++集合初始化的相关概念,就是一个比较重要的应用技术。那么我们就一起来看看这方面的内容吧。

C++集合初始化往往既冗长又容易出错。而C++中集合的初始化却变得很方便而且很安全。当我们产生一个集合对像时,我们要做的只是指定初始值就行了,然后初始化工作就由编译器去
承担了。这种指定可以用几种不同的风格,取决于我们正在处理的集合类型。但不管是哪种情况,指定的初值都要用大括号括起来。比如一个预定义类型的数组可以这样定义:

  1. int a[5]={1,2,3,4,5}; 

如果给出的初始化值多于数组元素的个数,编译器就会给出一条出错信息。但如果给的初始化值少于数组元素的个数,那将会怎么样呢?例如:

  1. int b[6]={0}; 

这时,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素。注意,如果我们定义了一个数组而没有给出一列初始值时,编译器并不会去做这些工作。所以上面的表达式是将一个数组初始化为零的简洁方法,它不需要用一个f o r循环,也避免了“偏移1位”错误(它可能比f o r循环更有效,这依赖于编译器)。

数组还有一种叫自动计数的快速初始化方法,就是让编译器按初始化值的个数去决定数组的大小:

  1. int c[] = {1,2,3,4}; 

现在,如果我们决定增加其他的元素到这个数组上,只要增加一个初始化值即可,如果以此建立我们的代码,只需在一处作出修改即可,这样,我们在修改时出错的机会就减少了。但怎样确定这个数组的大小呢?用表达式sizeof c/sizeof *c(整个数组的大小除以第一个元素的大小)即可算出,这样,当数组大小改变时它无需修改。

  1. for(int i = 0; i< sizeof c / sizeof *c; i++)  
  2. c [ i ] + + ; 

s t r u c t也是一种C++集合初始化类型,它们也可以用同样的方式初始化。因为C风格的s t r u c t的所有成员都是公共型的,所以它们的值可以直接指定:

  1. struct X {  
  2. int i;  
  3. float f;  
  4. char c;  
  5. } ;  
  6. x1 = {1,2.2,'c' }; 

如果我们有一个这种s t r u c t的数组,我们也可以用嵌套的大括号来初始化每一个对象。

  1. X x2[3] = {{1,1.1, 'a'},{2,2.2, 'b'}}; 

这里,第三个对象被初始化为零。

如果s t r u c t中有私有成员,或即使所有成员都是公共成员,但有一个构造函数,情况就不一样了。在上例中,初始值被直接赋给了集合中的每个元素,但构造函数是通过外在的接口
来强制初始化的。这里,构造函数必须被调用来完成初始化,因此,如果有一个下面的s t r u c t类型:

  1. struct Y {  
  2. float f;  
  3. int i;  
  4. Y(int A); // presumably assigned to i  
  5. } ; 

我们必须指示构造函数调用,最好的方法像下面这样:

  1. Y y2[] = {Y(1),Y(2),Y(3)}; 

这样我们就得到了三个对象和进行了三次构造函数调用。只要有构造函数,无论是所有成员都是公共的s t r u c t还是一个带私有成员的c l a s s ,所有的初始化工作都必须通过构造函数,即使
我们正在对一个C++集合初始化。

【编辑推荐】

  1. 删除C++容器值相关技巧讲解
  2. C++ Builder操作Excel表实现技巧讲解
  3. C++指针漂移问题解决方案
  4. C++头文件包含内容概览
  5. C++初始化和赋值区别解析
责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-04 13:56:24

C++类模板特化

2010-02-04 17:39:48

C++字符串类型

2010-02-02 10:33:22

C++引用

2010-02-03 13:22:07

C++时间

2010-02-05 12:57:20

C++ kdevelo

2010-02-03 14:36:47

C++仿函数

2010-02-01 17:24:41

C++循环语句

2023-11-12 23:08:17

C++初始化

2010-02-02 15:30:05

C++ include

2010-02-03 11:11:18

C++类型转换

2010-02-02 13:41:01

C++类继承

2010-02-01 14:07:12

C++多态性

2010-02-04 10:08:00

C++静态成员函数

2010-02-05 17:34:37

C++函数模板

2010-02-06 14:04:58

C++内存使用机制

2009-09-17 16:17:41

C#参差数组初始化

2011-06-17 15:29:44

C#对象初始化器集合初始化器

2009-12-21 15:33:07

WCF集合元素

2009-08-26 15:28:52

C#对象集合初始化器

2010-02-04 17:32:43

C++中C风格字符串
点赞
收藏

51CTO技术栈公众号