846 字
2 分钟
【CPP】基础与命名空间
C++ 与 C 的关系
- C++ 在 C 基础上增加面向对象与泛型编程(模板、STL),不是完全独立的语言。
- 多数 C 代码可被 C++ 编译器编译,但反过来不成立。
- 面向过程:以函数/步骤为中心,数据与操作分离。
- 面向对象:以对象为中心,数据(属性)与操作(方法)封装在类中。
C 与 C++ 主要差异(速查)
| 特性 | C | C++ |
|---|---|---|
| 重复声明 | 允许 | 同一作用域内不允许 |
| 函数返回值省略 | 旧式 C 可省略(不推荐) | 不能省略 |
空参数列表 f() | 表示参数未指定(旧语义) | 表示无参数 |
| 类型转换 | 较宽松 | 更严格,多用显式转换 |
| 引用 | 无 | 有 |
bool | C99 起有 | 内置 |
| 结构体标签 | 定义变量常需 struct 前缀 | 标签名即类型名,可含成员函数 |
| 变长数组 VLA | C99 支持 | 不支持,数组长度须为编译期常量 |
const | 可通过指针间接修改(视实现) | 语义更强;真正的常量语义 |
#define 与 const 定义常量
#define | const | |
|---|---|---|
| 类型 | 无类型(预处理替换) | 有类型,受类型检查 |
| 作用域 | 不受命名空间约束 | 受命名空间与作用域约束 |
| 调试 | 符号表中难追踪 | 可调试 |
命名空间
目的:划分声明区域,避免多人协作或引入第三方库时的标识符冲突。
namespace MyNamespace { int value = 0; void func() { /* ... */ } namespace inside { int temp = 0; } // 可嵌套}
// 同名命名空间自动合并namespace fun { void test(); }namespace fun { void test() { std::cout << "定义\n"; } }
// 别名namespace name { int num = 3; }namespace other_name = name;匿名命名空间
int value = 100;
namespace { int value = 200; // 仅本翻译单元可见,内部链接}
int main() { std::cout << value << '\n'; // 200(未限定名优先找到匿名命名空间成员) std::cout << ::value << '\n'; // 100(显式全局)}要点:
- 不能定义在块作用域内(只能文件作用域)。
- 等价于用
static限制链接属性的全局实体,但可包含类、函数等,语法更统一。 - C++17 起也可写
inline namespace做版本兼容,笔记未涉及,此处不展开。
使用方式
| 方式 | 作用 |
|---|---|
using 声明 | 将单个名字引入当前作用域 |
using namespace 指令 | 将整个命名空间名字引入当前作用域 |
:: 作用域解析 | 显式指定所属作用域 |
namespace Test { int num = 10; void show() { std::cout << "Test::show\n"; }}
// using 声明:若当前作用域已有同名,冲突// int num = 20;// using Test::num; // 错误:重复定义
using namespace Test;int num = 20; // 局部变量遮蔽 Test::numstd::cout << num; // 20(局部)std::cout << Test::num; // 10show(); // Test::show常见误区(原笔记已修正)
using namespace Test后cout << num输出 20 —— 原稿写“输出 20”的语境需有局部同名变量;若只有Test::num,则输出 10。::的查找顺序 ——::name表示从全局命名空间起查找;未加::的名字按 C++ 未限定名查找规则(内层作用域 → 外层 → using 引入的名字等),不是“先全局再匿名再局部”的固定三步。- 不要在头文件中使用
using namespace—— 会污染所有包含该头文件的翻译单元。
函数重载
- 同一作用域内,函数名相同、参数列表不同(类型或个数)构成重载;与返回值类型无关。
- 默认参数:从右向左连续设置,中间不能“跳空”。
- 占位参数(只有类型没有名字):调用时仍须传实参,常用于预留接口。
void f(int) {}void f(double) {} // OK
// void f(int); // 仅重复声明,不构成重载// int f(int); // 错误:仅返回值不同面向对象三大特征(简述)
| 特征 | 含义 |
|---|---|
| 封装 | 隐藏实现细节,通过公有接口访问 |
| 继承 | 派生类获得基类成员,实现代码复用 |
| 多态 | 同一接口不同实现;编译期(重载)与运行期(虚函数) |
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
【CPP】基础与命名空间
https://lysj.work/posts/studynotes/cpp/cpp基础与命名空间/ 部分信息可能已经过时
相关文章 智能推荐
