内容思维导图

第4章 复合类型
内容要点
1. 数组
- 数组(array)是一种数据格式,能够存储多个同类型的值。
- 数组声明应指出以下三点:
- 存储在每个元素中的值的类型。
- 数组名。
- 数组中的元素数。
- 声明数组的通用格式:
// arraysize指定元素数目,必须是整型常数或const值,也可以是常量表达式
typename arrayname[arraysize];
// 数组声明
int data[10];
// 数组初始化
int data[3] = { 20, 30, 40 };
int data[] = { 4, 8 }; // 由编译器计算元素个数
int data[6] = { 7, 10 }; // 部分初始化,其他编译器设置为0
- 数组初始化的几条规则:
- 只有在定义数组才能使用初始化,此后就不能使用,也不能将一个数组赋值给另一个数组;
- 初始化数组时,提供的值可以少于数组的元素数目,未提供值的元素编译器设置为0;
- 初始化数组时方括号([])为空,编译器将计算元素个数。
2. 字符串
- 字符串是存储在内存的连续字节中的一系列字符。
- C-风格字符串(C-style string)
- 基于string类库的方法
- C-风格字符串具有一种特殊的性质:以空字符(null character)结尾,空字符被写作\0,其ASCII码为0,用来标记字符串的结尾。注意:下面第二个字符数组才是字符串。
char dog[5] = { 'b', 'e', 'a', 'u' 'x' } // 不是字符串
char cat[5] = { 'f', 'a', 't', 's', '\0' } // 是字符串
- 用引号括起的字符串(字符串常量string constant或字符串字面值string liteal)隐式的包括结尾的空字符,因此不用显式的包括它。
char bird[10] = "Mr. Cheeps"; // 隐含\0字符
char fish[] = "Bubbles"; // 让编译器计算数组元素个数
- 各种C++输入工具通过键盘输入,将字符串读入到数组中时,将自动加上结尾的空字符。
- 任何两个空白(空格、制表符和换行符)分隔的字符串常量将自动拼接成一个。
cout << "I'd give my right arm to be" " a great violinist.\n";
cout << "I'd give my right ar"
"m to be" " a great violinist.\n";
- 将字符串存储到数组最常用的两种方法:
- 将数组初始化为字符串常量
- 将键盘或文件输入读入到数组中
- cin使用空白(空格、制表符和换行符)来定字符串的界。
- cin面向行的类成员函数
-
getline():丢弃换行符
-
-
get():将换行符保留在输入序列中
-
-
cin.get()读取空行后将设置失效位(failbit),意味着将接下来的输入阻断,可使用命令cin.clear()来恢复输入。 - C++程序常使用指针(而不是数组)来处理字符串。
3. string类简介
-
string对象和字符数组之间的主要区别是,可以将string对象声明为简单变量,而不是数组。 -
string类的一些操作- 赋值:可以将一个
string对象赋给另一个string对象
- 赋值:可以将一个
- 合并:可以使用操作符
+将两个string对象合并起来
- 合并:可以使用操作符
- 附加:可以使用操作符
+=将一个字符串附加到一个string对象的末尾
- 附加:可以使用操作符
- 计算长度:使用类方法
size()计算string对象的字符串长度
- 计算长度:使用类方法
4. 结构简介
- 创建结构的步骤:
- 定义结构描述——描述并标记能够存储在结构中的各种数据类型
- 按描述创建结构变量(结构数据对象)
// structure description
struct inflatable
{
char name[20]; // member
float volume;
double price;
};
struct inflatable goose; // keyword struct required in C
inflatable vincent; // keyword struct not required in C++
- C++允许指定占用特定位数的结构成员,使得创建与某个硬件设备上的寄存器对应的数据结构非常方便。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,指定使用了的位数。可以使用没有名称的字段来提供间距。每个成员都被称为位字段(bit field)。
struct torgle_register
{
unsigned int SN: 4; // 4 bits for SN value
unsigned int: 4; // 4 bits unused
bool gooIn: 1; // valid input (1 bit)
bool goodTorgle: 1; // successful torgling
}
5. 共用体
- 共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。声明句法如下:
union one4all
{
int int_val;
long long_val;
double double_val;
};
- 共用体的长度为其最大成员的长度。
6. 枚举
- C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替
const。枚举的符号常量叫作枚举量(enumerator)。语法如下:
enum spectrum { red, orange, yellow, green, blue, violet, indigo, ultraviolet };
- 枚举变量的一些特殊属性
- 在不进行强制转换的情况下,只能将定义枚举时使用的枚举量赋给这种枚举的变量。
- 对于枚举,只定义了赋值操作符,没有为枚举定义算术运算。
- 枚举量为整型,可被提升为
int整型,但int不能自动转换为枚举类型。
- 枚举量为整型,可被提升为
- 设置枚举量的值
- 使用赋值操作符显示设置
- 显式定义其中一些枚举量的值
- 可创建多个值相同的枚举量
- 可以使用
long类型值
- 可以使用
enum bits { one = 1, two = 2, four = 4, eight = 8 };
enum bigsteps { first, second = 100, third }; // first为0,third为101
enum { zero, null = 0, one numero_uno = 1 }; // zero和null值都为0
- 每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任何整数值赋给枚举变量,即使这个值不是枚举值。
enum bits { one = 1, two 2, four = 4, eight 8 };
myflag = bits(6); // valid
7. 指针和自由存储空间
- 指针相关操作符
- 取址操作符:
&
- 取址操作符:
- 间接值或解除引用操作符:
*
- 间接值或解除引用操作符:
- 内存分配
new
- 内存分配
- 内存释放
delete
- 内存释放
- 箭头成员操作符
->
- 箭头成员操作符
- 指针声明
int * pData; // 两边空格可选
int* pData; // C++ style
int *pData; // C style
// Note!!!
int* p1, p2; // p2是int变量不是指针
- 注意:在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。
- 警告:一定要在对指针应用解除引用操作符(*)之前,将指针初始化为一个确定的,适当的地址。
- 术语“数据对象”,指的是为数据项分配的内存块。为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的通用格式如下:
typename pointer_name = new typename;
- 在编译时给数组分配内存被称为静态联编(static binding);数组在程序运行时创建的称为动态联编(dynamic binding),这种数组叫做动态数组(dynamic array)。
- 使用
new和delete时应遵守的规则:- 不要使用
delete来释放不是new分配的内存。
- 不要使用
- 不要使用
delete释放同一个内存块两次。
- 不要使用
- 如果使用
new[]为数组分配内存,则应使用delete[]来释放。
- 如果使用
- 如果使用
new[]为一个实体分配内存,则应使用delete来释放。
- 如果使用
- 对空值指针应用
delete是安全的。
- 对空值指针应用
- 为数组分配内存的通用格式:
type_name pointer_name = new type_name [num_elements];
8. 指针、数组和指针算术
-
指针与数组名的区别
- 可以修改指针的值,而数组名是常量。
- 对数组应用
sizeof操作符得到的是数组的长度,而对指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组。
- 对数组应用
给
cout提供一个字符的地址,则它将从该字符开始打印,直到遇到空字符为止。在C++中,用引号括起来的字符串像数组名一样,也是第一个元素的地址。
-
C++3种管理数据内存的方式
- 自动存储
-
- 静态存储
- 2.1 函数外部定义
- 2.2 声明变量时使用关键字
static
- 动态存储