【C++奇遇记】初探名称空间

news2024/9/9 5:24:58

🎬 博客主页:博主链接
🎥 本文由 M malloc 原创,首发于 CSDN🙉
🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📆 未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述
在这里插入图片描述

文章目录

  • 😇命名空间的前情介绍
  • 😇本章详情
  • 😇传统的C++名称空间
    • 📝声明区域(declaration region)
  • ✉新的名称空间特性
    • 📋C++新增的功能
    • 😇using声明和using编译指令
  • 📃如何巩固学习
  • 📃本文小结

😇命名空间的前情介绍

😁在C++中,名称可以是变量、函数、结构、枚举、类以及类和结构的成员。当随着项目的增大,名称相互冲突的可能性也将增加。使用多个厂商的类库时,可能导致名称冲突。例如:两个库可能都定义了名为List、Tree和Node的类,但定义的方式不兼容。用户可能希望使用一个库的List类,而使用另一个库的Tree类。这种冲突被称为名称空间问题。

😇本章详情

🐤本篇文章将讲授C++的命名空间相关的知识

😇传统的C++名称空间

📝声明区域(declaration region)

前言

声明区域是可以在其中进行声明的区域。例如,可以在函数外面声明全局变量,对于这种变量,其声明区域为其声明所在的文件。对于在函数中声明的变量,其声明区域可以为其声明所在的代码块。


潜在作用域(potential scope)

变量的潜在作用域从声明点开始,到其声明区域的结尾,因为潜在作用域比声明区域小,这是由于变量必须定义后才能使用。


C++关于全局变量和局部变量的规定定义了一种名称空间层次。每个声明区域都可以声明名称,这些名称独立于在其他声明区域中声明的名称。在一个函数中声明的局部变量不会与在另一个函数中声明的局部变量发生冲突。

#include<iostream>
using namespace std;
int add(int left, int right)
{
	return left + right;
}
double add(double left, double right)
{
	return left + right;
}
void Swap(int* p1, int* p2)
{}
void Swap(double* p1, double* p2)
{}

int main()
{
	cout << add(1, 1) << endl;
	cout << add(1.1, 1.1) << endl;

	return 0;
}

在上述代码中从#include 到最后一个有括号为止都属于声明区(全局名称空间)

✉新的名称空间特性

📋C++新增的功能

💐通过定义一种新的声明区域来创建命名的名称空间,这样做的目的之一是提供一个声明名称的区域。一个名称空间中的名称不会与另外一个名称空间的想通名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。例如,下面的代码使用新的关键字namespace创建了两个名称空间:

输入

namespace mei
{
	double pail;
	float price;
	int pal;
}
namespace zhi
{
	double fetch;
	float price;
	int pal;
}

注意

名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。因此,在默认的情况下,在名称空间中声明的名称的链接性为外部的(除非它引用了常量)


全局名称空间(global namespace)

🌱它对应于文件级声明区域,因此前面所说的全局变量现在被描述为位于全局名称空间中。


作用域解析运算符::

🌻我们需要一种方法来访问给定名称空间中的名称。最简单的方法就是,通过作用域解析运算符::,使用名称空间来限定该名称:

#include<iostream>
namespace mei
{
	double pail;
	float price;
	int pal;
}
namespace zhi
{
	double fetch;
	float price;
	int pal;
}
int main()
{
	mei::pail = 12.22;
	zhi::price = 10.1;
	return 0;
}

😇using声明和using编译指令

📖我们并不希望每次使用名称时都对它进行限定,因此C++提供了两种机制(using声明和using编译指令)来简化对名称空间中名称的使用。using声明使特定的标识符可用,using编译指令使整个名称空间可用

using声明由被限定的名称和它前面的关键字using组成:

using mei::pail;//a using declaration

🌼using声明将特点名称添加到它所属的声明区域中。例如main()中的using声明mei::pail将pail添加到main()定义的声明区域中。完成该声明后,便可以使用名称pail代替mei::pail。下面的代码说明了这几点:

#include<iostream>

namespace mei
{
	double pail;
	float price;
	int pal;
}
namespace zhi
{

	double fetch;
	float price;
	int pal;
}
double pail;
int main()
{
	using mei::pail;//a using declaration

	float pail;
	std::cin >> pail;
	mei::pail = 12.22;
	zhi::price = 10.1;
	return 0;
}

我们来看上述代码,其实上述代码是会报错的,我们来看报错信息

在这里插入图片描述
由于using声明将名称添加到局部声明区域中。因此这个示例避免了将另一个局部变量也命名为pail另外,和其他局部变量一样,pail也将覆盖同名的全局变量

在函数的外名声明时,将把名称添加到全局名称空间中:

#include<iostream>
void other();
namespace mei
{
	double pail;
	float price;
	int pal;
}
namespace zhi
{

	double fetch;
	float price;
	int pal;
}
using mei::pail;//a using declaration

int main()
{
	std::cin >> pail;
	other();
	return 0;
}
void other()
{
	std::cout << pail << std::endl;
}

using声明使一个名称可用,而using编译指令使所有名称都可用。using编译指令由名称空间名和它前面的关键字using namespace 组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符::

using namespace mei;

在使用using编译指令和using声明,需要记住的一点是,它们增加了名称冲突的可能性

📃如何巩固学习

提示:在学习的过程中,我们需要先自行进行思考,并且多去阅读一些大佬的书籍,俗话说的好,书籍是人类进步的阶梯!

📃本文小结

  1. C++鼓励程序员在开发程序时使用多个文件。一种有效的组织策略是,使用头文件来定义,为操纵用户类型的函数提供函数原型;并将函数定义放在一个独立的源代码文件中。头文件和源代码文件一起定义和实现了用户定义的类型及其使用方式。最后,将main()和

好啦今日的分享到这里就结束啦,我是爱你们的M malloc希望可以帮助到你们噢,最后别忘记三连啦!!

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/822275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu篇——Ubuntu20.04备份成ISO镜像文件并安装到其他电脑上(完整步骤)

注意&#xff0c;此方法制作的镜像&#xff0c;仅限于相同硬件配置的电脑安装&#xff0c;否则可能会发生某些驱动不兼容导致无法安装的情况。&#xff08;例如英伟达显卡的笔记本电脑&#xff0c;很大概率无法安装你在其他显卡电脑上制作的镜像。&#xff09; 一、安装systemb…

设计模式行为型——命令模式

目录 什么是命令模式 命令模式的实现 命令模式角色 命令模式类图 命令模式举例 命令模式代码实现 命令模式的特点 优点 缺点 使用场景 注意事项 什么是命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式&#xff0c;它属…

一篇关于CPU的硬核知识

不管你玩硬件还是做软件&#xff0c;你的世界都少不了计算机最核心的 —— CPU。 01CPU是什么&#xff1f; CPU与计算机的关系就相当于大脑和人的关系&#xff0c;它是一种小型的计算机芯片&#xff0c;通常嵌入在电脑的主板上。CPU的构建是通过在单个计算机芯片上放置数十亿…

iOS开发-UIScrollView嵌套tableView实现顶部tab横向切换

iOS开发-UIScrollView嵌套tableView实现顶部tab横向切换 通过ScollView嵌套两个TableView左右切换功能 一、UIScollView UIScrollView可滚动控件&#xff0c;这里初始化需要设置_backScollView.pagingEnabled YES; 代码如下 _backScollView [[UIScrollView alloc] initWi…

ARP协议请求

文章目录 作用请求与应答流程数据包ARP协议以太网帧协议具体应用 作用 通过 IP地址 查找 MAC地址。 请求与应答流程 A&#xff1a;数据发送主机 B&#xff1a;目标主机 目前只知道目标主机IP地址&#xff0c;想把数据发送过去&#xff0c;需要查询到目标主机的MAC地址&#x…

构建基于大模型的Autonomous Agents案例(一)

构建基于大模型的Autonomous Agents案例 1.1 Autonomous Agents原理机制 在本节中&#xff0c;我们将聚焦于LangChain上的自治代理&#xff08;Autonomous Agents on LangChain&#xff09;。自治代理是当前业界最热门的话题之一&#xff0c;特别是在企业级应用中。当然&#x…

关于综合能源智慧管理系统的架构及模式规划的研究

安科瑞 华楠 摘 要&#xff1a;探讨了国内外能源互联网的研究发展&#xff0c;分析了有关综合智慧能源管理系统的定位&#xff0c;以及系统的主要特点&#xff0c;研究了综合智慧能源管理系统的构架以及模式规划。 关键词&#xff1a;综合能源&#xff1b;智慧管理系统&#…

MySql操作进阶

目录 1.多表联查 1.1内连接 1.2左连接和右连接 1.3自连接 2.子查询 3.合并查询 1.多表联查 多表联查实际上就是对多张表中的数据合并在一起进行查询&#xff0c;具体合并多张表中的数据方式为&#xff1a;取笛卡尔积的方式进行合并。 但仅是以笛卡尔积的方式合并表较为…

网络安全进阶学习第九课——SQL注入介绍

文章目录 一、什么是注入二、什么是SQL注入三、SQL注入产生的原因四、SQL注入的危害五、SQL注入在渗透中的利用1、绕过登录验证&#xff1a;使用万能密码登录网站后台等。2、获取敏感数据3、文件系统操作4、注册表操作5、执行系统命令 六、如何挖掘SQL注入1、SQL注入漏洞分类按…

无涯教程-Lua - Arrays(数组)

数组是对象的有序排列&#xff0c;可以是包含行集合的一维数组&#xff0c;也可以是包含多行和多列的多维数组。 在Lua中&#xff0c;数组是使用带有整数的索引表实现的。数组的大小不是固定的&#xff0c;并且可以根据无涯教程的要求(取决于内存限制)来增长。 一维数组 一维…

WEB应用程序数据库防守篇之预防SQL漏洞注入

前言: 国内目前几乎市面上所有的web应用程序都使用关系型数据库来存储用户的数据信息&#xff0c;可以这么说&#xff0c;数据库是一个项目&#xff0c;一个互联网公司乃至国家最重要的数据中心。如果数据库被入侵成功&#xff0c;所引发的后果将是灾难性&#xff0c;无法想象…

JavaSE 【类和对象】(3)(重点:代码块、对象的打印)

目录 一、代码块 1.静态代码块 2.构造代码块/实例代码块 3.总结 代码块执行的顺序&#xff1a; 1.静态代码块 2.构造代码块&#xff08;实例代码块&#xff09; 3.执行对应的构造方法 其中&#xff1a;静态的只执行一次 二、 对象的打印 有一个快速打印的方法&#x…

scrapy框架简单实现豆瓣评分爬取案例

豆瓣网址&#xff1a;https://movie.douban.com/top250 1.创建scrapy框架 scrapy startproject 项目名(scrapy_test_one)创建好以后的目录是这样的 2.创建spider文件 在spiders目录下创建一个spider_one.py文件&#xff0c;可以随意命名&#xff0c;该文件主要是让我们进行数…

MaxPatrol SIEM 增加了一套检测供应链攻击的专业技术

我们为 MaxPatrol SIEM 信息安全事件监控系统增加了一套新的专业技术。 该产品可帮助企业防范与供应链攻击相关的威胁。 此类攻击正成为攻击者的首要目标&#xff1a;它们以软件开发商和供应商为目标&#xff0c;网络犯罪分子通过他们的产品进入最终目标的基础设施。 因此&a…

【数据结构】——线性表的相关习题

目录 题型一&#xff08;顺序表的存储结构&#xff09;题型二&#xff08;链表的判空&#xff09;题型三&#xff08;单链表的建立&#xff09;题型四&#xff08;顺序表、单链表的插入删除&#xff09; 题型一&#xff08;顺序表的存储结构&#xff09; 1、线性表的顺序存储结…

Framework开发的热度从未下降~

近几日&#xff0c;统计局也发布了就业相关数据&#xff0c;全国失业青年达600多万&#xff0c;面对此数据&#xff0c;我们能想到的是实际的失业人数肯定会比公布的数据要多很多&#xff0c;尤其是表示 “一周工作一小时以上” 也纳入了就业范围。 反观有一批Android开发在如此…

JavaWeb之HTML基础篇(一)

系列文章目录 HTML基础篇&#xff08;一&#xff09; 文章目录 系列文章目录HTML基础篇&#xff08;一&#xff09;[TOC](文章目录) 前言一、HTML简介1.1介绍1.2HTML文件的书写规范1.3 HTML标签介绍1.4 HTML常见的标签 二、CSS的简介2.1css技术介绍2.2 CSS与HTML结合的三种方式…

org.springframework.beans.factory.aot.BeanRegistrationExcludeFilter-若依二开报错(已解决)

阿丹-问题描述&#xff1a; 今天在复制已经拆解过后的若依system模块删除掉中间的一些东西之后&#xff0c;出现了一个问题。已启动就报错。报错截图如下。 问题解析&#xff1a; 身边不少二开若依的小伙伴都遇到了这个问题。 这个异常是因为在启动应用程序时&#xff0c;Sprin…

杜教筛的小结

总所周知&#xff0c;杜教筛是一个可以快速求积性函数前缀和的工具&#xff0c;为了快速理解杜教筛&#xff0c;自己给自己写了一个文章快速理解。 它可以在O(n2/3)的复杂度快速求出某个积性函数的前缀和。 例如&#xff0c;我们想要知道 f f f函数的前缀和&#xff0c;我们可…

selenium官网文档阅读总结(day 2)

1.selenium元素定位方法 1.1selenium命令 当我们使用chormdriver打开网页后&#xff0c;接下来就要用python操作元素&#xff0c;模拟用户会作出的操作&#xff0c;这些操作元素的方法就是命令。比如 (1) click&#xff1a;点击&#xff08;按钮&#xff0c;单选框&#xff…