本章将介绍所有以上复合类型,new和delete以及如何使用它们来管理数据。除此,还将简要地介绍string类——另一种处理字符串的途径。
4.1 数组数组(array)是一种数据格式,能够存储多个同类型的值。
数组声明必须包含三点:
类型(int or double or others…)
数组名
元素个数
语法格式:
typeName arrayName[arraySize]
//例如:
short months[12];
int yams[2] = {20, 30}
arraySize为指定元素个数,必须为整形常数或const值或常量表达式(8*sizeof(int)),不能为变量。
注意:编译器不会检查使用的下标是否有效,即如果将一个值赋给不存在的元素months[110],编译器也不会指出错误,但是程序运行后,赋值可能引发问题,破坏数据或代码,也可能导致程序异常终止。所以必须确保程序使用有效的下标值。
1、 初始化只能在定义数组时使用,不能将一个数组直接赋给另一个数组;
int cards = {2, 3, 5}; //allowed
int hand[3]; // allowed
hand[3] = {2, 3, 5}; //not allowed
hand = cards; //not allowed
2、初始化数组时,提供的值可以少于数组的元素个数(其他元素默认设置为0);
3、初始化时内[]为空,C++编译器会自动计算元素个数。编译器将使hand数组包含3个元素。(不推荐)
int hand[] = {2, 3, 5};
4.1.3 C++数组初始化方法
C++11将大括号的初始化(列表初始化)作为一种通用初始化方式,可用于所有类型。
1、 初始化数组时,可省略“ = ”;
int hand [3] {2, 3, 5};
2、 大括号内可为空,将把所有元素设置为0;
3、禁止缩窄转化。
long plif[] = {24, 93, 3.0}; //not allowed,浮点数转换为整形为缩窄
char slifs[4] {‘h’, ‘i’, 1122011, ‘ ’}; //not allowed,1122011//超出了char变量的取值范围(假设char变量长度为8位)
char tlifs[4] {‘h’, ‘i’, 112, ‘ ’}; // allowed,112在char变量范围内
4.2 字符串
字符串是存储在内存的连续字节中的一系列字符。
C++处理字符串方式有两种:
- C-风格字符串(c-style string)
- 基于string类库
C-风格字符串以空字符( )结尾,其ASCII码为0,用来标记字符串的结尾。
char dog[2] = {‘a’, ‘b’ }; //not a string
char dog[2] = {‘a’, ‘ ’}; // a string
字符串常量:只需使用一个用引号括起来的字符串即可初始化字符数组为字符串。
char bird[11] = {“Mr.Cheeps”};
用双引号括起来的字符串隐式地包括结尾的空字符。
注意:字符串常量(双引号)和字符常量(单引号)不能互换。
char shirt = ‘S’; //ok char shirt = “S”; //illegal,”S”表示两个字符(S和 ),实际上表示字符串所在地址4.3 string类简介
使用string类,必须包含头文件string,string类位于名称空间std中。
#includeusing namespace std;
使用string对象方式和使用字符数组相同:
可使用C-风格字符串来初始化string对象
可使用cin来读取键盘输入存储到string对象,cout显示对象
可使用数组表示法访问string对象中的字符
string对象和字符数组的主要区别:可以将string对象声明为简单变量而非数组。
string str1; string str2 = “dog”;
类设计使得程序可以自动处理string的大小,比如初始化长度为0的string对象会根据程序该string对象的赋值操作时自动调整其长度。
4.3.2 赋值、拼接和附加C-风格字符串,头文件cstring提供函数,比如strcpy();
String类可直接将一个string对象赋值给另一个string对象;可使用运算符+=将字符串附加到string对象的末尾,或直街通过=判断相等。
结构是一种比数组更为灵活的数据格式,可以存储多种类型的数据。
结构时用户定义的类型,结构声明定义该类型的数据属性。创建结构包括2步:1)定义结构描述-描述并标记能够存储在结构中的各种数据类型;2)按描述创建结构变量。
例如:
struct inflatable
{
char name[20];
float volume;
double price;
}
关键字struct表明,这是一个结构。标识符inflatable是这种数据格式的名称,即新类型的名称为inflatable。
创建inflatable变量:
inflatable hat; hat.price; //可以使用(.)运算符来访问结构中的成员,返回会定义时的double类型 hat.name; //为一个char数组4.4.1 在程序中使用结构
结构声明的位置:
提倡使用外部结构声明。
1、支持列表初始化,且“ = ”为可选项;
2、 如果{}为空,各个成员默认设置为0;
3、不允许缩窄转化。
1)、 可以将结构作为参数传给函数,也可以让函数返回一个结构;
2、 可以使用赋值运算符“ = ”将结构赋给另一个同类型结构。
可以创建元素为结构的数组,方法和创建基本类型数组完全相同。
inflatable结构包含一个数组,也可以创建元素为inflatable结构的数组,
inflatable gifts[100]; //一个包含100个inflatable类型的结构
共用体(union)是一种数据格式,可以存储不同的数据类型,但只能同时存储其中的一种类型。此处区别于结构体可以同时存储多种数据类型。
union one4all
{
int int_val;
long long_val;
double double_val;
}
//可以使用one4all来存储int、long、double,条件是在不同的时间进行:
one4all pail; pail.int_val = 15; //store an int cout << pail.int_val; pail.double_val =1.35; //store a double, int value is lost cout << pail.double_val;
上例中,pail开始是int变量,后来是double变量。成员名称标识了变量的容量,而共用体每次仅能存储一个值,故其长度为最大成员的长度。
可将共用体想象为一个格子的抽屉,一次只能存放一种物体,而结构体为一个拥有多个格子的抽屉,可同时存放多种物体。
共用体的用途:
数据项使用两种或更多种格式(但不会同时使用),使用共用体可节省空间。比如管理一个商品目录,其中一些商品的ID为整数,另一些ID为字符串。



