导图社区 第四章 复合类型
本文依据 史蒂芬·普拉达编写的《C primer plus》(第六版中文版)及对应《习题解答》所总结。
编辑于2023-05-06 21:37:55 湖北省四、复合类型
进一步接近OOP
复合类型基于整型和浮点类型创建,以满足数据的更多要求,影响最深远的复合类型是类,普通的复合类型有数组、字符串、结构、共用体、指针、枚举等
数组
数组是一种数据格式,可以存储多个类型相同的值,其中每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组中的各个元素
创建数组
使用声明语句并指出三点:元素类型,数组名,元素数 格式:typeName arrayName[arraySize], arraySize必须是整型字面量
初始化数组
时刻:只有在定义数组时才能使用初始化,并且不允许数组间赋值
操作:提供初始化列表(用逗号分隔的值列表,以花括号括起) 注意:提供的值可以少于数组的元素数目,其它元素将设置为0,列表不提供任何值时所有元素默认设置为0,初始化时如果不告知数组元素数目,编译器会自动计算元素个数
未初始化的数组的内容是未定义的
使用:组名[序号]
字符串
字符串是存储在内存的连续字节中的一系列字符,C++有两种处理方式
C风格:本质是对字符数组操作
C++风格:基于string类库的方法
C风格:字符数组
字符串字面值(常量):"xxx" 一个用引号括起的字符串,实际表示字符串所在的内存地址 ,并且任何两个由空白分隔的字符串常量都将自动拼接成一个
存储字符串
初始化:将数组初始化为用引号括起的字符串,将自动添加一个空字符结尾,\0用来标记字符串的结尾
输入字符串:cin>>,cin.get(),cin,getline() 后者是cin的面向行的类成员函数,读取一行输入,直到达到换行符(回车键)或者字符读满时停止,三者都会自动在结尾添加空字符\0
cin>>
cin使用空白(空格、制表符和换行符)确定字符串的结束位置,因此cin获取字符数组输入时只能读取一个单词 以换行符结尾时会将其留在输入队列中
示例:cin>>arrayName;
cin.get()
接受两个参数,用来存储的数组名和要读取的字符数 通过换行符确定结尾,将换行符留在输入队列中
注意:遗留在输入队列的换行符会导致一些问题 用不带参数的cin.get()可以读取下一个字符,用来处理换行符,为下一行输入做好准备
示例: cin.get(arrayName,ArSize); cin.get(); cin.get(arrayName2,ArSize);
也可以合并两个函数:cin.get(arrayName,ArSize).get();
cin.getline()
接受两个参数,用来存储的数组名和要读取的字符数 通过换行符确定结尾,将换行符替换为空字符
示例:cin.getline(arrayName,ArSize);
cin.clear()
当get()读取空行后将设置失效位,接下来的输入将被阻断,可使用 cin.clear();命令恢复输入
当输入字符串比分配的空间长时,二者会把余下的字符留在输入队列中,getline()会设置失效位,关闭后面的输入
其它操作:头文件<cstring>提供了一些C语言库中的函数来完成这些工作,使用参数指出要使用哪个字符串
C++风格
string类简介:专门处理字符串的类型,提供了将字符串作为一种数据类型的表示方法,隐藏了数组性质,从而可以像处理普通变量那样处理字符串
相同之处: 可用C风格字符串初始化string对象 可以用cin输入,可以用cout输出 可用数组表示法访问存储在string对象中的字符
主要区别:可将string对象声明为简单变量,类设计让程序能自动处理string的大小 默认长度为0,输入时将自动调整对象长度
string类基本操作
string类对象允许相互赋值 允许使用+/+=运算符将字符串加到string对象的末尾
string类I/O
输入
使用cin读取一个单词时,句法与C风格字符串相同
每次读取一行时句法不同,示例:getline(cin,str); 表明这个getline不是istream的类方法,第一个参数cin指出到哪里查找输入,第二个参数是要存储字符串的string类对象
输出
cout句法相同,不必考虑内部工作原理
其他操作:C++string类对象使用对象名和句点运算符指出要使用哪个字符串,调用该类的类方法
结构
结构可以存储多个不同类型的值,是用户定义的类型,是OOP类的基石
使用结构(三步)
建立结构声明:定义了这种类型的数据属性,指出其特征
通用格式: struct My_Name { ... }; (struct关键字可省)
位置选择:外部声明可以被后面的任何函数调用,内部声明只能被该声明所属的函数调用 通常应使用外部声明,另外C++不提倡外部变量,提倡外部结构声明和符号常量
标识符My_Name是用户定义的这种数据格式的名称,是新的类型名,之后便可以创建My_Name类型的变量;大括号内是结构存储的数据类型的列表,每个列表项都是一条声明语句,每一项都被称为结构成员
注:此时不能赋初值
声明结构类型变量
创建变量
(可省略)struct My_Name x,y,...,z;
省略结构类名:struct { ...}x,y,...,z; (定义结构时声明变量,由于没有类型名称以后无法再定义此类型变量)
创建结构数组:My_Name array[n]; 成员变量表示为array[x].member 初始化结合数组和结构规则{{...},{...},...,{...}};
初始化
与数组一样,用初始化列表(逗号分隔值列表) 不能跳跃赋值
如果大括号内未包含任何东西,每个成员都将被设置为0,字符数组的每个字节都被设置为0
定义变量时赋值,给成员单独赋值,”=“赋值
访问结构变量
使用成员运算符(.)访问,把每个结构成员看作相应类型的变量
其它属性(C++使用户定义的类型与内置类型尽可能相似)
可作为参数传递给函数,可以让函数返回一个结构,同类型的结构可以互相赋值,即使成员是数组
结构中的位字段
允许占用特定位数的结构成员,每个成员都被称为位字段
可以用通常方法初始化,用结构表示法访问位字段
用途:省空间,表示硬件状态,访问硬件设备上的寄存器等
共用体
共用体是一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种类型(一次只能存储一个值),所以共用体类变量的类型可以不断变化
union My_Name {...}; 成员变量可以带上自己的类型方便识别
特性
共用体的长度是最大成员的长度
匿名共用体没有名称,成员将成为位于相同地址处的变量
用途
为同项数据提供多种格式
节省内存,嵌入式开发,操作系统或硬件数据结构
枚举
enum
另一种创建符号常量的方式,可代替const
允许定义新类型
使用(句法与使用结构相似)
定义枚举类型
通用格式:enum My_Name {x,y,...,z};
My_Name 成为新类型的名称,称为枚举; x,y,z等是符号常量,叫做枚举量;默认第一个常量为0,依次递增
使用
只能将定义枚举类时确定的枚举量赋给该枚举类的变量 示例:My_Name H; H=x;
枚举量是整型,可被提升为int型,没有为枚举量定义算术运算,可以和常规整数混合运算
设置枚举量的值:通过赋值运算符显示设置,必须是整数,没有被初始化的常量比前面的枚举量大一,可以创建多个值相同的枚举量
常用于定义相关的符号常量,而非新类型;如果只打算定义常量,可以省略枚举类型名称
指针
用new和delete管理数据
动态内存管理初步
指针部分单独列出
第7章介绍和函数接口的联系
5,6,17章将介绍这些属性
cin的较高级特性见第17章