第4章 复合类型-1

本章包含知识点:

 数组

 C风格字符串

 string类字符串

 getline()和get()读取字符串

 混合输入字符串和数组

 结构

 共用体

 枚举

 指针

 关键字new和delete

 动态数组

 动态结构

 自动存储、静态存储、动态存储

 vector和array

本章将介绍所有以上复合类型,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],编译器也不会指出错误,但是程序运行后,赋值可能引发问题,破坏数据或代码,也可能导致程序异常终止。所以必须确保程序使用有效的下标值。

4.1.2 数组的初始化规则

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, ‘\0};    //not allowed,1122011//超出了char变量的取值范围(假设char变量长度为8位)
char tlifs[4] {‘h’, ‘i’, 112, ‘\0};     // allowed,112在char变量范围内

4.2 字符串

字符串是存储在内存的连续字节中的一系列字符。
C++处理字符串方式有两种:

  1. C-风格字符串(c-style string)
  2. 基于string类库
    C-风格字符串以空字符(\0)结尾,其ASCII码为0,用来标记字符串的结尾。
char dog[2] = {‘a’, ‘b’ };   //not a string
char dog[2] = {‘a’, ‘\0};  // a string

字符串常量:只需使用一个用引号括起来的字符串即可初始化字符数组为字符串。

char bird[11] = {“Mr.Cheeps”};

用双引号括起来的字符串隐式地包括结尾的空字符。
注意:字符串常量(双引号)和字符常量(单引号)不能互换。

char shirt = ‘S’;        //ok
char shirt = “S”;      //illegal,”S”表示两个字符(S和\0),实际上表示字符串所在地址

4.3 string类简介

使用string类,必须包含头文件string,string类位于名称空间std中。

#include <string>
using 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对象的末尾,或直街通过=判断相等。

4.4 结构简介

结构是一种比数组更为灵活的数据格式,可以存储多种类型的数据。
结构时用户定义的类型,结构声明定义该类型的数据属性。创建结构包括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 在程序中使用结构

结构声明的位置:
在这里插入图片描述
提倡使用外部结构声明。

4.4.2 C++11结构初始化

1、支持列表初始化,且“ = ”为可选项;
2、 如果{}为空,各个成员默认设置为0;
3、不允许缩窄转化。

4.4.4其他结构属性

1)、 可以将结构作为参数传给函数,也可以让函数返回一个结构;
2、 可以使用赋值运算符“ = ”将结构赋给另一个同类型结构。

4.4.5 结构数组

可以创建元素为结构的数组,方法和创建基本类型数组完全相同。
inflatable结构包含一个数组,也可以创建元素为inflatable结构的数组,
inflatable gifts[100]; //一个包含100个inflatable类型的结构

4.5 共用体

共用体(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为字符串。

4.6 枚举

enum工具提供一种创建符号常量的方式,可代替const,允许定义新类型,但需按照严格的限制进行。
例子:

enum spectrum 
{
red, orange, yellow, green, blue, violet, indigo, ultraviolet
};        //成员没有类型

以上语句完成两项工作:
 让spectrum成为新类型的名称:spectrum被称为枚举(enumeration),类似struct变量称为结构;
 将red、orange、yellow等作为符号常量,对应整数值0-7。这些常量称为枚举量(enumerator),为spectrum的可能值。
默认将整数值(不能为float)赋给符号常量,第一个枚举量为0,第二个为1,依次类推。
定义一个枚举类型时,只能取定义时所包含的符号常量值。如:

spectrum band;    //只有8个可能的值 
band = blue;     //valid,blue is an enumerator
band = 3000;    //invalid,blue is not enumerator

枚举只定义了赋值运算符,没有算数运算符。
枚举量是整形,可被提升为int类型,但int类型不能自动转换为枚举类型:

int color = blue;    //valid, 
band = 4;     //invalid, int not converted to spectrum
color = 4 + red;    //vaild, red converted to int
band = red + blue; // invalid, 右边为int型,无法将其赋给类型为spectrum的变量band;
band = spectrum(3);  //valid,进行了强制类型转换

枚举常用来定义相关的符号常量,而非新类型。
枚举用途:
 定义switch中的符号常量

4.6.1 设置枚举量的值

可使用赋值运算符显示地初始化枚举量的值:

enum bit{one =1,  two = 2, three = 3, eight =8};

指定的值必须时整数,也可以只显示地初始化部分枚举量的值:

enum bigstep{first, seconde = 100, third};

firtst默认为0,后边没有被初始化的枚举量的值比前一个枚举量的值大1,因此third为101。
可以创建多个值相同的枚举量。此外,也可以使用long或者long long类型的值。

4.6.2 枚举的取值范围

枚举量中的最大值对应的最小的2的幂-1,为取值范围的上限;枚举量中最小的值,如果>=0,则下限为0,否则采取上限取值方式,再加上负号。
例如上述定义的bigstep,最大值为101,对应的最小的2的幂为128,故其上限为128-1 = 127;如果最小的枚举量为-6,比它小的、最大的2的幂为8,8-1再加上负号即为-7。
(博主个人而言目前此部分不太重要)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我宿孤栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值