一、基础语法与数据类型
1. 基本类型
整型(int、short、long)、浮点型(float、double)、字符型(char)、布尔型(bool)。 复合类型:数组、结构体、联合体、枚举。 指针和引用:指针存储地址,引用是变量的别名。 空类型:void。
2. 常量与变量
-
const 深度解析:
const修饰的变量必须初始化;修饰指针时分三种情况——const T* p(指向常量的指针,指针指向的内容不可改)、T* const p(常量指针,指针本身不可改)、const T* const p(指向常量的常量指针,二者都不可改);const修饰成员函数时(如void func() const;),表示该函数不会修改类的成员变量(mutable修饰的成员除外)。 -
#define 与 const/constexpr 对比:
#define是预处理阶段文本替换,无类型检查,可能引发宏展开陷阱(如#define M 10+2,M*3会被展开为10+2*3);const是运行时常量(C++11 前)/编译期常量(C++11 后,满足条件时);constexpr强制编译期计算,可用于函数、类构造函数,要求表达式无副作用,如constexpr int sum(int a, int b) { return a + b; },调用时sum(3,4)会在编译期算出结果。 -
常量表达式与常量表达式函数:C++11 引入的
constexpr用于标识编译期可计算的值,constexpr函数在传入编译期常量参数时,返回值为编译期常量;传入运行时参数时,退化为普通函数。
3. 指针与引用
-
指针进阶:空指针(C++11 推荐
nullptr,类型安全,替代NULL(本质是 0 的宏));野指针(未初始化或指向已释放内存的指针,访问会导致未定义行为);悬空指针(指向的内存被释放,但指针未置空);函数指针(void (*fp)(int);,指向函数的指针,可用于回调函数、实现多态);指向成员函数的指针(void (Class::*mp)(int);,需通过对象或指针调用,语法为(obj.*mp)(arg)或(ptr->*mp)(arg))。 -
引用深度剖析:引用的本质是编译器优化的指针,底层占用指针大小的内存,但语法上无地址操作;必须初始化,且一旦绑定不能更改指向;常引用(
const T&)可绑定临时对象、字面量、不同类型的兼容对象(如const int& ref = 10;),延长临时对象的生命周期;引用作为函数返回值时,不能返回局部变量的引用(局部变量销毁后引用悬空),常用于实现链式调用(如ostream& operator<<(ostream& os, const T& val))。 -
指针与引用的核心区别:引用不能为空,指针可以;引用初始化后不可改指向,指针可以;sizeof(引用) 是所指对象的大小,sizeof(指针) 是固定的。
4. 函数
-
函数重载规则:重载的判断依据是参数列表的个数、类型、顺序,与返回值无关;const 成员函数与非 const 成员函数构成重载(调用时,const 对象调用 const 版本,非 const 对象调用非 const 版本)。
-
默认参数细节:默认参数必须从右往左连续指定(如
void func(int a, int b=10, int c=20);合法,void func(int a=10, int b);非法);默认参数在函数声明和定义中只能出现一次(通常写在声明中)。 -
函数指针与回调:函数指针数组(如
void (*fpArr[])(int) = {func1, func2};),常用于实现简单的'命令模式';回调函数的典型场景(如排序函数 qsort 的比较函数参数)。

