文章目录
🍥前言
在 C++ core guidelines 中有一个准则: ES.5 保持作用域短小
。要遵循这点需要明确作用域到底是什么,有哪些,有什么用。
并且 C++ 的作用域和 C语言 的 作用域又大有不同,因此不能直接沿用 C语言 的作用域。但是作用域的本质作用的不变的。
作用域是代码中声明的一种属性,它是可见性和生命周期交叉的地方。
名字只在它的作用域中可见,但对象的生命周期不一定受限于其名字的作用域。
对象具有存储期,存储期决定了对象的生命周期。
🍥C++ 6大作用域
🐟块
一个块级作用域是由花括号括起来的语句序列。
块级作用域只需要一对大括号就可以嵌套,在嵌套作用域中名字重复是合法的。内层的名字将隐藏外部的名字。
可以通过域访问符号::
来访问外部的一些名字,但有的名字一旦被隐藏就找不到了。
有些编译器会对覆盖的名字有一定的提示,但我们也不能完全依赖编译器。
🐟名字空间
自定义的名字空间也是由{}
组成。
匿名名字作用域 该作用域的影响到包含该作用域外的空间结束,且拥有++内部链接++的性质。
全局作用域 是名字空间作用域的一个特例,是全局命名空间引入的命名空间作用域。该作用域又名文件作用域是一个翻译单元开始的一个作用域。
cpp
// 全局作用开始
namespace lotus {
namespace {
int x = 114514; // x开始 具有内部链接
}
} // namespace lotus 结束 // x结束
// 全局作用域结束
🐟类
类作用域是块作用域的一个变体。
类中声明的符号,从声明点开始到类作用作用域结束。
cpp
class A {
// void check(ll x); // 错误,识别不到`ll`
using ll = long long;
void check(ll x); // ok 可以看到 `ll`
};
🐟函数参数
函数作用域类似于块作用域,但其增加了函数签名。
函数作用域从函数签名中声明点开始,到函数(申明或定义)尾结束。
特殊情况 :若受到try catch
影响,则会提前终止。
cpp
void fun(int a); // 函数声明 a开始 a结束
void fun(int a) { // a开始
// pass
try {
// pass
return ; // a继续
} catch (...) { // a继续
// pass
} // a结束
}
🐟枚举
枚举作用域是与生命周期无关的作用域。
无作用域枚举
cpp
enum RGB {
r,
g, // g 开始
b
}; // g的作用域未结束
// g继续延续到下方
有作用域枚举
cpp
enum class RGB {
r, // r开始
g,
b
}; // r 的作用域到此结束
// 通过域访问符获取
RGB e = RGB::r;
🐟模板参数
模板参数名的作用域从声明点开始,到引入它的最小的那个模板声明的末尾结束。
模板分为函数模板和类模板,函数和类也有自身的作用域,参见上文。
cpp
template <typename T> // T 开始
void swap(T &a, T &b) {
// pass
} // T 结束
⭐END
🌟交流方式
⭐交流方式⭐ |C/C++|算法|设计模式|软件架构-CSDN社区
关注我,学习更多C/C++,python,算法,软件工程,计算机知识
B站:
👨💻主页:天赐细莲 bilibili