846 字
2 分钟
【CPP】基础与命名空间
2026-03-18

C++ 与 C 的关系#

  • C++ 在 C 基础上增加面向对象泛型编程(模板、STL),不是完全独立的语言。
  • 多数 C 代码可被 C++ 编译器编译,但反过来不成立。
  • 面向过程:以函数/步骤为中心,数据与操作分离。
  • 面向对象:以对象为中心,数据(属性)与操作(方法)封装在类中。

C 与 C++ 主要差异(速查)#

特性CC++
重复声明允许同一作用域内不允许
函数返回值省略旧式 C 可省略(不推荐)不能省略
空参数列表 f()表示参数未指定(旧语义)表示无参数
类型转换较宽松更严格,多用显式转换
引用
boolC99 起有内置
结构体标签定义变量常需 struct 前缀标签名即类型名,可含成员函数
变长数组 VLAC99 支持不支持,数组长度须为编译期常量
const可通过指针间接修改(视实现)语义更强;真正的常量语义

#defineconst 定义常量#

#defineconst
类型无类型(预处理替换)有类型,受类型检查
作用域不受命名空间约束受命名空间与作用域约束
调试符号表中难追踪可调试

命名空间#

目的:划分声明区域,避免多人协作或引入第三方库时的标识符冲突。

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::num
std::cout << num; // 20(局部)
std::cout << Test::num; // 10
show(); // Test::show

常见误区(原笔记已修正)#

  1. using namespace Testcout << num 输出 20 —— 原稿写“输出 20”的语境需有局部同名变量;若只有 Test::num,则输出 10。
  2. :: 的查找顺序 —— ::name 表示从全局命名空间起查找;未加 :: 的名字按 C++ 未限定名查找规则(内层作用域 → 外层 → using 引入的名字等),不是“先全局再匿名再局部”的固定三步。
  3. 不要在头文件中使用 using namespace —— 会污染所有包含该头文件的翻译单元。

函数重载#

  • 同一作用域内,函数名相同、参数列表不同(类型或个数)构成重载;与返回值类型无关
  • 默认参数:从右向左连续设置,中间不能“跳空”。
  • 占位参数(只有类型没有名字):调用时仍须传实参,常用于预留接口。
void f(int) {}
void f(double) {} // OK
// void f(int); // 仅重复声明,不构成重载
// int f(int); // 错误:仅返回值不同

面向对象三大特征(简述)#

特征含义
封装隐藏实现细节,通过公有接口访问
继承派生类获得基类成员,实现代码复用
多态同一接口不同实现;编译期(重载)与运行期(虚函数)
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

【CPP】基础与命名空间
https://lysj.work/posts/studynotes/cpp/cpp基础与命名空间/
作者
Sekiro
发布于
2026-03-18
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录