(C++) 6大作用域

文章目录

🍥前言

在 C++ core guidelines 中有一个准则: ES.5 保持作用域短小。要遵循这点需要明确作用域到底是什么,有哪些,有什么用。

并且 C++ 的作用域和 C语言 的 作用域又大有不同,因此不能直接沿用 C语言 的作用域。但是作用域的本质作用的不变的。

作用域是代码中声明的一种属性,它是可见性和生命周期交叉的地方。

名字只在它的作用域中可见,但对象的生命周期不一定受限于其名字的作用域。


对象具有存储期,存储期决定了对象的生命周期。

🍥C++ 6大作用域

C++ 作用域 - cppreference.com

C语言作用域 - cppreference.com

(Effective C) 2.3 作用域-CSDN博客

🐟块

一个块级作用域是由花括号括起来的语句序列。

块级作用域只需要一对大括号就可以嵌套,在嵌套作用域中名字重复是合法的。内层的名字将隐藏外部的名字。

可以通过域访问符号::来访问外部的一些名字,但有的名字一旦被隐藏就找不到了。

有些编译器会对覆盖的名字有一定的提示,但我们也不能完全依赖编译器。

🐟名字空间

自定义的名字空间也是由{}组成。

匿名名字作用域 该作用域的影响到包含该作用域外的空间结束,且拥有++内部链接++的性质。

全局作用域 是名字空间作用域的一个特例,是全局命名空间引入的命名空间作用域。该作用域又名文件作用域是一个翻译单元开始的一个作用域。

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

相关推荐
郝学胜-神的一滴1 分钟前
避免使用非const全局变量:C++中的最佳实践 (C++ Core Guidelines)
开发语言·c++·程序人生
我没想到原来他们都是一堆坏人5 分钟前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
搞一搞汽车电子12 分钟前
S32K3平台eMIOS 应用说明
开发语言·驱动开发·笔记·单片机·嵌入式硬件·汽车
沙二原住民14 分钟前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控
java·数据库·oracle
Jerry&Grj39 分钟前
SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践
java·微服务·性能优化·springboot·架构设计·埋点技术
没有bug.的程序员1 小时前
Redis Stream:轻量级消息队列深度解析
java·数据库·chrome·redis·消息队列
总有刁民想爱朕ha1 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)
开发语言·python·数据挖掘
用户8160791833331 小时前
告别“魔法”:包你解决 Gradle 的下载慢问题
java
小菜全2 小时前
uniapp新增页面及跳转配置方法
开发语言·前端·javascript·vue.js·前端框架
人衣aoa2 小时前
Python编程基础(八) | 类
开发语言·python