基础知识点:
数组:
1. 定义数组时,size必须是编译时已知的:整型常量、const值、常量表达式。但是可以通过new动态数组来避开这个限制;
2. 数组只能在定义时整体初始化,定义后只能单个数组元素赋值,同样不能将一个数组整体赋值给另一个数组。
3. C++大括号(列表)初始化是通用的初始化方式:
1)可省略“=”:int earnMoney[3] {10000, 8000, 26000};
2)列表初始化禁止缩窄精度。
4. 数组替代品,更复杂灵活。动态数组替代品:模板类vector;静态数组替代品:模板类array。
普通数组 | 模板类array | 模板类vector |
int a[3] = {} | array<int, 3> ai; | vector<int> vi(3); |
静态,栈 | 静态,栈 | 动态,堆heap |
不可互相赋值 | 可互相赋值 | 可互相赋值 |
静态数组替代品 | 动态数组替代品 |
5. 重点注意:有效下标的重要性。非有效下标编译时不会报错,但是运行时会破坏数据和代码,甚至导致程序异常终止,所以必须确保下标的有效性。
字符串:
定义:存储在内存连续字节中的一系列字符。
1. c-style字符串:存储在char数组中,必须是\0结尾,否则不是字符串:char cat[4] = {'c', 'a', 't', '\0'};
用双引号括起来的字符串常量隐式的包含结尾的空字符: char dogName[] = "danier";
2. C++:string类库:使用指针处理字符串;
3. string类对象可以互相赋值,也可以相加;
4. string类具有自动调整大小的能力;
5. 原始字符串:R"(XXXXX)"; R"+*XXXX+*";
6. strlen()返回可见字符的长度。sizeof()返回整个数组的长度。
结构体:
1. 定义:先定义结构体类型,再声明结构体变量,最后给变量赋值。声明是,允许省略struct关键字。C++不提倡外部变量,但是结构体可以,而且符号常量更应该声明为外部变量。
2. 同类型的结构体间可以互相赋值。
3. C++的结构体成员可以是函数。
4. 结构体数组:数组的每个元素都是一个结构体。
5. 结构体位字段:低级编程中,对硬件寄存器的操作。
6. 共用体:所成员内存单元地址相同,用于节省内存。
7. 枚举:另一种创建符号常量的方式,可代替const。
8. 枚举成员的值可以相同。
9. int类型需要强制类型转换成枚举:color(2);
指针:
1. 指针用来跟踪内存,配合new分配内存,提供了灵活性,可以运行阶段决策。在运行阶段分配匿名内存以存值。
2. 创建指针时,仅仅分配存储指针本身的地址,并不会分配指针指向的地址,所以一定要在解引用前初始化。
3. C++会确保空指针不指向有效数据。对空指针应用delete是安全的。
4. delete只会释放指针指向的内存,但是并不会删除指针变量本身,所以该指针变量还可以重新赋值。
5. 不能通过sizeof获取动态数组的字节数;
自动存储 | 静态存储 | 动态存储 | 线程存储 |
函数内部定义的变量 | 函数外面定义或使用static修饰 | new/delete | |
函数被调用时产生,结束调用时消亡 | 整个程序执行期 | 用户控制声明周期 | |
存在栈区 | 堆heap区 |