文章目录
前言
本篇文章将对《C++PrimerPlus》第4章进行勾画
以我个人习惯来勾画
C和C++不同点将用红色高亮表示
关于C++的额外补充知识用蓝色高亮表示
对C++的注意点以及总结部分用绿色高亮
正常情况本专栏2周更新一次
4.1 数组
4.2 字符串
4.2.1 拼接字符串常量
4.2.2 在数组中使用字符串
4.2.3 字符串输入
4.2.4 每次读取一行字符串输入
- 成员函数
getline()
类似于C语言中的gets()
,二者都是面向行输入,并且都将换行符
读取并转化为结束符
存储,二者都不会忽略空白符- 成员函数
get()(有参数)
类似于C语言中的scanf()
,二者都是面向单词输入,并且遇见换行符
会自动在末尾添加结束符
,不会将换行符从缓冲区读出来,不同之处是scanf会忽略空白符,get()不会忽略空白符- 成员函数
get()(无参数)
类似C语言getchar()
,二者都不会忽略空白符- cin类似C语言scanf,二者都会忽略空白符
4.2.5 混合输入字符串和数字
4.3 String类
String类包含于头文件string
使用String类需要使用using编译指令
string类和字符数组的相同点
- 都可以使用字符串常量初始化
- 都可以使用cin来输入
- 都可以使用cout来输出字符串
- 都可以使用数组的表示法来访问存储再string对象中的字符
不同点
- string对象表示的是一个字符串实体,字符数组存储的是一个个字符
4.3.1 C++11字符串初始化
4.3.2 赋值、拼接和附加
string对象可以执行的功能
- 赋值,string类对象可以将整个字符串直接赋值给另一个string类对象
例如str1 = str2
- 拼接,可以使用
+
将2个string对象合并
4.3.3 sring类的其他操作
- string对象不需要担心字符串过长,对象存不下,string类具有自动调整大小的功能
- string类具有成员函数
size
来求字符串的长度,无需调用库函数strlen
4.3.4 string类I/O
- 输入
string
类对象可以使用getline(读取一整行)
函数,第一个参数为cin,第二个参数为string对象- 输入
string
类对象可以使用cin(读取一个单词)
- string对象未初始化时长度默认为0
4.3.5 其他形式的字符串
除了普通的字符串
c++还有wchar_t(宽字符串)
char16_t
char32_t
类型的字符串,它们每个字符所占的大小与普通字符不同
C++还有原始类型(raw)字符串,原始类型字符串中没有转义字符
4.4 结构简介
C++中的结构和C语言中的结构不完全一样,C++可以直接用结构体标签定义变量,而C语言必须加上
struct
关键字
4.2.1 在程序中使用结构
C++推荐在外部声明结构,外部声明的结构可以在所有函数中使用
C++不推荐外部声明变量
4.4.2 C++11结构初始化
4.4.3 结构可以作为string类的成员吗
4.4.4结构的其他属性
- 可以将一个结构变量赋值给另一个结构变量
- C++的结构中可以定义函数,C不行
4.4.5 结构数组
4.4.6 结构中的位字段
4.5 共用体
- C++可以直接用共用体标签定义变量,C不行
- 共用体的成员公用一个地址,共用体的成员可以在
不同的时候
存储不同的数据- 当结构体成员是匿名共用体时,共用体中的成员被视为结构体的成员
- 共用体常用于节省内存
4.6 枚举
- 枚举用关键词
enmu
定义,枚举中的符号称为枚举常量- 枚举常量的值默认从0开始,可以通过显示的
整型值
覆盖默认值
- 在不进行强制类型转换时,只能将枚举常量赋值给枚举变量
- 对于枚举变量,只定义了赋值运算,没有定义算术运算
- 枚举是整形,可以被提升为
int
型,但是int
数据不能自动转换为枚举- 对一个不适当的整形进行强制转化,结果是不确定的
4.6.2 枚举取值范围
- 枚举的上限:找出枚举常量的最大值,找到大于该值的最小二次幂,然后减一
- 枚举的下线:如果枚举常量的最小值大于0,下限为0,如果最小值小于0,将该值取反变成正数,通过找到最小大于该正数的二次幂,减一后再取反就是下限
- 枚举的大小由编译器决定
4.7 指针和自由存储空间
- 变量的三种属性
- 变量的数值
- 变量存储的地址
- 变量存储数值的类型
- 通过
&变量名
获得变量的地址,存放该地址的变量称为指针变量- 通过
*变量名
获得地址为该变量值的内容cout
输出地址时以十六进制输出
4.7.1 声明和初始化指针
- 指针声明时必须指定指针所指向的数据类型
- 指向不同类型数据的指针在同一个计算机系统上的大小是相等的
4.7.2 指针的危险
4.7.3 指针和数字
4.7.4 使用new来分配内存
- 指针变量可以存储没有名称的数据对象:数据项的内存块的地址
- new在运行时为数据对象分配内存
- new分配的内存块在堆上
4.7.5 使用delete释放内存
delete
的用法和free
的用法一样- 只能将动态开辟的其实地址
delete
- 只能将动态开辟的内存
delete
一次- delete只能释放
new
分配的内存new
后没有delete
,可能导致内存泄漏delete
空指针是安全的
4.7.6 使用new来创建动态数组
- 编译时为数组分配内存称为
静态联编
- 运行时为数组分配内存称为
动态联编
- 使用
new[element_number]
动态开辟数组- 不要使用delete来释放不是new分配的内存。
- 不要使用 delete释放同一个内存块两次。
- 如果使用new[]为数组分配内存,则应使用 delete[]来释放。
- 如果使用new[]为一个实体分配内存,则应使用 delete(没有方括号)来释放。
- 对空指针应用 delete 是安全的。
- 动态开辟的数组可以通过指针来访问
- 数组名是常量,指针是变量
4.8 指针、数组、和指针的算术
4.8.1 程序说明
4.8.2 指针小结
4.8.3 指针和字符串
- 如果给
cout
提供字符的地址,那么它就会从该字符开始打印,直到遇见结束符
,如果像显示该字符的地址,必须将该地址进行强制类型转换为其他类型地址- C++中,用双引号括起来的字符串和数组名一样代表首元素地址
- 不可以修改
字符串常量
- 将字符串读入程序中,应使用已分配的内存地址
- 只有初始化字符数组时才可以使用=,否则应该使用
strcpy
4.8.4 使用new创建动态结构
使用new可以节省内存
4.8.5 自动存储、静态存储、动态存储
- 在函数内部定义的常规变量使用
自动存储
,随着函数结束自动销毁- 在函数外面定义的或者使用
static
定义的变量使用静态存储
,程序结束会自动销毁- new开辟的空间使用到你
动态存储
,什么时候delete
什么时候销毁
4.9 类型组合
4.10 数组的替代品
4.11 模板类vector
vecotr
类需要引用头文件vector
包含在名称空间std中vector
语法vector<type_name>vt(n_elem)
vector
对象的元素个数可以是变量vector
对象是动态存储分配
4.10.2 模板类array(C++11)
array
类需要引用头文件array
位于名称空间中array
语法array<type_name, n_elem>va
array
对象的元素个数是常量array
使用栈(静态分配内存)
数组、vector对象、array对象区别
vecotr
和array
会对索引值检查是否越界,但是普通数组不会- 普通数组和
array
对象在栈区vector
对象在堆区