导图社区 C++第4章:复合类型
《C Primer Plus》第四章同步思维导图。总结了C 复合类型的介绍:C-字符串、string、结构、指针和一些模板类的概述等等,适合温故和复习。
编辑于2021-01-24 01:22:02第4章 复合类型
4.1 数组
4.1.1 程序说明(*)
4.1.2 数组的初始化规则
(1)只有在定义的时候才能初始化
(2)不能将一个数组赋给另一个数组
(3)未给定值的初始化变量将默认设置为0
(4)列表初始化禁止缩窄转换
4.2 字符串
4.2.1 拼接字符串常量(cout)
4.2.2 在数组中使用字符串
4.2.3 字符串输入(cin)
4.2.4 每次读取一行字符串输入
1. 面向行的输入:cin.getline()
cin.getline(char*name, int n) 向name中读入一整行,遇到换行符结束。 若设置了长度n,则最多读取n个字符
2. 面向行的输入:cin.get()
cin.get(char*name, int n) 向name中最多读入n个字符,若不足则 用空字符补足
cin.get() 调用读取下一个字符
3. 空行和其他输入
读取错误可使用cin.clear()来恢复cin设置
4.2.5 混合输入字符串和数字
注意cin.get()读入后的换行符
4.3 string类简介
4.3.1 C++字符串初始化
4.3.2 赋值、拼接和附加
4.3.3 string类的其他操作
4.3.4 string类I/O
4.3.5 其他形式的字符串字面值
1. 其他类型字符串
wchar_t title[] = L"Chief Astrogator";
char16_t name[] = u"Felonia Ripova";
char32_t car[] = U"Humber Super Snipe";
2. 原始字符串
定界符:"(和)" 前缀:R(可结合使用)
cout << R"(Jim "King" Tutt uses "\n" instead of endl.)" << "\n"; 输出: Jim "King" Tutt uses "\n" instead of endl.
4.4 结构简介
4.4.1 在程序中使用结构
4.4.2 C++11结构初始化
4.4.3 结构可以将string类作为成员吗?(可以)
4.4.4 其他结构属性
1. 可以将结构作为参数传递给函数
2. 可以让函数返回一个结构
3. 可以用赋值运算符(=)将结构赋给另一个结构(即使成员中有数组)
4.4.5 结构数组
4.4.6 结构中的位字段(略)
4.5 共用体(union)
能够储存不同的类型,但只能同时存储其中的一种类型。共用体有命名时,需要用id.m访问,没有命名时,直接访问即可,因为他们的地址相同。
union id { int m; double n; }
4.10 数组的替代品
4.10.1 模板类vector
(1)要使用vector对象,必须要先包含头文件vector (2)vector包含在名称空间std中,可只用using编译指令、using声明或std::vector
#include<vector> ...... using namespace std; vector<int> vi; // create a zero-size array of int int n; cin >> n; vector<double> vd(n); // create an array of n doubles
一般而言,下面的声明创建一个名为vt的vector对象,它可存储n_elem个类型为typename的元素: vector<typename> vt(n_elem); 其中参数n_elem可以为整型常量,也可以为整形变量。
4.10.2 模板类array
(1)vector类的功能虽然强大,但是效率较低 (2)array包含在名称空间std中 (3)array对象的长度也是固定的,也使用栈(静态内存分配),而不是自由存储区,因此效率与数组相同,但是更方便、更安全 (4)要创建array对象,需要包含头文件array
#include<array> ...... using namespace std; array<int, 5> ai; // create array object of 5 ints array<double, 4> ad = {1.2, 2.1, 3.43, 4.3};
推而广之,下面的声明创建一个名为arr的array对象,它包含n_elem个类型为typename的元素: array<typename, n_elem> arr; 与创建vector不同的是,n_elem不能是变量
4.10.3 比较数组、vector对象和array对象
· 无论是数组、vector对象还是array对象,都可以用标准数组表示法来访问各个元素(arr[i]) · array对象和数组存储在相同的内存区域(即栈)中,而vector对象存储在另一个区域(自由存储区域或堆)中 · 可以将array对象赋给另一个array对象,而对于数组,必须逐个复制元素
4.9 类型组合(*)
4.8 指针、数组和指针算术
4.8.1 程序说明
数组名是常量,不可以进行运算
4.8.2 指针小结
4.8.3 指针和字符串
4.8.4 使用new创建动态结构
struct things { char name[20]; double price; } things* p = new things; 注意表示price的时候需要用括号标明优先级:(*p).price
4.8.5 自动存储、静态存储和动态存储
1. 自动存储
在函数内部定义的常规变量使用自动存储空间,被称为自动变量。这意味着它们在所属函数被调用时自动产生,函数结束时自动消亡。 自动变量通常储存在栈中,在执行代码块时,其中的变量将依次加入到栈中,在离开代码块时,按相反的顺序释放这些变量,这被称为后进先出(LIFO)
2. 静态存储
静态存储是整个程序执行期间都存在的存储方式。 定义的两种方式: (1)函数外面定义 (2)使用关键字static
3. 动态存储
new和delete管理了一个内存池,在C++中被称为自由存储空间(free store)或堆(heap)。该内存池同静态变量和自动变量的内存是分开的,因此数据的生命周期完全不受程序或函数的生存时间控制。这让程序员对程序如何使用内存有更大的控制权,但管理也更加复杂。
4.7 指针和自由存储空间
4.7.1 声明和初始化指针
4.7.2 指针的危险
不要主动将指针赋予一个自己创造的值
4.7.3 指针和数字
4.7.4 使用new来分配内存
4.7.5 使用delete释放内存
4.7.6 使用new来创建动态数组
int* p = new int; delete p; int* pt = new double[10]; delete[] pt;
4.6 枚举(enum)
4.6.1 设置枚举的值
enum bits{one, two = 3, four}; 指定的值必须是整数(int,long,long long)。这里one没有初始值,默认为1,后面没有被初始化的枚举量的值依次+1.
4.6.2 枚举的取值范围
根据定义的枚举量的最大最小值来确定新定义的枚举量的可取值范围。如: enum m{a = -2, b = 4, c = 9}; d = m(13); 新定义的enum d的取值范围就在-7~16之间,因此上述代码是合法的。