C++ 兼容 C 语言,这意味着我们可以在 C++ 环境下编写 C 代码。了解其基础概念对于掌握这门语言至关重要。
一、命名空间
在 C++ 中,标识符(变量、函数、类等)的查找遵循作用域规则:编译器从当前最内层作用域开始查找,找到即止。如果同一作用域下存在同名标识符,就会引发冲突。
1. 解决冲突
例如,stdlib.h 中有 rand 函数。如果在局部定义 int rand = 10;,由于局部优先,代码能执行;但如果是全局定义,则与库函数冲突导致编译报错。
命名空间就是为解决此类冲突设计的'自定义域'。
语法:
namespace 命名空间名 {
// 自定义标识符
}
访问时使用 命名空间名::标识符。
2. 嵌套与使用
命名空间可以嵌套,形成层级结构。若需简化调用,可使用 using 关键字。
- 指定成员:
using 命名空间名::成员; - 全部展开:
using namespace 命名空间名;
注意:同一个命名空间可以分散在不同文件中,编译器会自动合并它们。标准库中的所有内容都位于 std 命名空间中。
二、输入输出
C++ 使用 <iostream> 头文件提供流式 I/O 功能。
- cin/cout: 分别代表控制台输入和输出。由于它们在
std命名空间中,使用时需加前缀或引入命名空间。 - 运算符:
<<是流插入运算符,>>是流提取运算符。它们支持链式操作,可一次处理多个内容。 - endl: 表示换行并刷新缓冲区。
示例:
#include<iostream>
using namespace std;
int main() {
int a, b;
cout << "请输入两个整数:";
cin >> a >> b;
cout << "两数之和为:" << a + b << endl;
}
C++ 能自动识别变量类型,无需像 C 那样手动指定占位符。
三、缺省参数
函数定义时可为参数指定默认值。调用时若不传参则使用默认值。
- 全缺省: 所有参数都有默认值。
- 半缺省: 部分参数有默认值。规定必须从右向左连续设置,且调用时必须先传完非缺省参数。
注意: 声明和定义分离时,缺省值只能出现在声明中。
四、函数重载
同一作用域内允许存在同名函数,前提是参数列表不同(个数、类型或顺序)。这提高了代码的可读性和复用性。
int Add(int a, int b) { return a + b; }
double Add(double x, double y) { return x + y; }
五、引用
引用是已有变量的别名,直接操作原内存地址,常用于函数传参以减少拷贝开销。
1. 基本特性
- 初始化: 定义时必须绑定对象。
- 不可变: 引用一旦绑定,不能更改指向其他对象。
- 多引用: 一个变量可有多个引用,修改任一引用都会影响原变量。
2. Swap 对比
指针方式需要解引用,引用方式更直观。
void Swap(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
}
3. const 引用
用于修饰临时变量或常量,防止意外修改。普通引用不能绑定临时变量,因为临时变量生命周期短且不安全,而 const 引用延长了其生命周期并限制了权限。
4. 引用 vs 指针
| 特性 | 引用 | 指针 |
|---|---|---|
| 空间 | 不单独占用空间 | 占用内存存储地址 |
| 初始化 | 必须初始化 | 建议初始化 |
| 绑定 | 不可改绑 | 可重新赋值 |
| 安全性 | 无空指针风险 | 可能为空或野指针 |
六、宏与内联函数
1. 宏 (Macro)
预处理阶段的文本替换。分为有参和无参宏。需注意运算符优先级,通常给参数加括号。
2. 内联函数 (Inline)
被 inline 修饰的函数,编译器尝试在调用处展开代码,避免栈帧创建开销。它本质仍是函数,支持调试,且由编译器决定是否采纳。
区别: 宏是文本替换,无法调试;内联函数是函数,更安全。
七、nullptr
C++11 引入了 nullptr 关键字表示空指针。相比 NULL(通常为 0),nullptr 具有明确的指针类型,能避免函数重载时的歧义。
void Print(int* x) { /* ... */ }
void Print(int x) { /* ... */ }
Print(nullptr); // 明确调用指针版本
Print(NULL); // 可能误判为 int 版本

