最近在复习C++考试,整理了部分基础知识点,在这里分享一部分,类与对象会在后面的文章中介绍。内容比较简洁,仅适合对C++产生一个大致印象,如果对更多的细节感兴趣可以翻阅一些专业书籍,如著名的《C++ Primer Plus》。如有错误请指出。
1 基本概念
1.1 基本数制
16进制:0x; 8进制:0。
1.2 基本数据类型
1.3 常量
整型常量、实型常量、字符串常量、符号常量。
1.4 变量
1.5 运算符与表达式
不同数据类型转换规则:占用内存空间大的数据类型为主。
关系运算符与关系表达式、 逻辑运算符与逻辑运算表达式、条件运算符与条件表达式、位运算符与位运算表达式、赋值运算符与赋值表达式、逗号运算符与逗号表达式、sizeof运算符
1.6 编译预处理
预编译(宏展开),将宏名替换为字符串。
#define 标识符
//定义宏:宏有歧义,特别是自增(i++)等运算时。
#define max(a, b) (a) > (b)? (a) : (b)
#endef 标识符 //解除#define语句定义的标识符
#include<头文件> //与“”的差别在于检索目录的顺序不同。
#ifdef...#else...#endif //如果有/没有定义宏,执行以下代码。
#ifndef...#else...#endif
1.7 编程步骤
源代码(cpp)-> 编译器 -> 目标代码(object code,机器语言) -> 链接程序(启动代码、库代码) -> 可执行代码。
2 程序控制结构
2.1 格式控制符
2.2 几个特殊函数
- goto():无条件跳转,编译器不做任何条件判断,谨慎使用。
- exit(), _exit(), abort():在头文件process.h or stdlib.h中,表示退出程序(进程)。
3 函数
3.1 参数传递
-
值调用:实参的值不会改变
-
引用调用:swap(&a, &b),传递变量地址
-
地址调用:传递变量地址
-
函数 & 指针:void sum_arr(int arr[], int n)实际arr[]表示的是一个指针。但只有在作为函数参数时才能这么用。因此必须传递首地址+数组长度。
3.2 函数重载
函数名称相同,参数类型和参数个数不同。仅返回值类型不同不能重载。
3.3 内联函数
用inline修饰,必须出现在对其的调用之前。函数体内不能有循环、switch分支、复杂if嵌套。编译器会把不适合作为内联的函数视为普通函数。
tips:内联函数依然是函数,进行参数传递。而宏并非是参数传递,而是文本替换(宏是C语言中的内联函数,可以考虑把宏转换为C++内联函数)。如:
#define SQUARE(X) X * X
a = SQUARE(4.5 + 7.5) // -> 4.5 + 7.5 * 4.5 + 7.5,自增运算同理结果不太对。
3.4 函数模板
template <class Any> //Any只是一个名称
Any swap(Any &a, Any &b)
{
//...
}
3.5 存储类别
- 自动存储auto:作用域为包含它的代码块。自动释放,可重新分配。auto和static变量的寿命被限制。
- 静态存储static:存在于程序的整个生命周期,存放于静态存储区(与全局变量一起)。静态变量的初值仅在分配存储空间的时候设置一次,程序运行期间不可再赋值。
- 动态存储new和delete。
3.6 内存构成
- 栈:系统自动控制,存放函数参数、局部变量。大小有限制。速度快。
- 堆:new和malloc控制。链表结构,速度慢、
- 静态存储区:存放全局变量和静态变量。
- 字符常量区:存放常量字符串。
- 程序代码段:存放代码。
- 虚存的地址空间:VitualAlloc。
4 指针
4.1 地址和指针
- 地址:变量地址&variable;数组地址数组名;函数地址函数名。
4.2 指针运算
int *nA, x;
nA = &x;
cout << *nA; //2
*(ptr+2); //->ptr[2]
4.3 动态内存管理
new和delete。
*ptr = new int;
tips:
- 内存需要通过delete释放。
- 分配成功与否需要测试(堆中空间不足会返回NULL)。
4.4 指针和函数
- 指针作为函数的参数。
- 返回指针的函数。需要注意的是,返回的指针不能是局部变量的指针,因为函数一结束这个局部变量就没了。可以是静态变量或者分配在堆上的其他空间。
- 指向函数的指针。常在插件时使用。