C++——关于命名空间

news2024/11/26 0:13:54

写c++项目时,大家常用到的一句话就是:

using namespace std;

怎么具体解析这句话呢?

命名冲突:

在c语言中,我们有变量的命名规范,如果一个变量名或者函数名和某个库里面自带的库函数或者某个关键字重名,就会报错,这时候,我们只能给自己定义的变量或者函数进行改名。

但是,为了填补c语言在这方面的缺陷,c++提供了命名空间这一功能,专门解决命名冲突这一问题。

具体情景:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
int rand = 0;
int main()
{
	printf("%d\n", rand);
	return 0;
}

 出现这种情况的原因就是,在stdlib这个库里面本身就有一个rand函数,然后和变量发生了命名冲突。

命名空间的语法定义:

namespace xxx
{
	int rand = 0;
	struct Node
	{
		struct Node* next;
		int val;
	};
}

可以看出,在命名空间中,我们可以定义变量函数结构类型

命名空间的具体功能:

当主函数使用某一个变量时,默认从全局找,而不会到命名空间找,也就是说,就像是对外加了一层权限,只有在特定情况下才可以调用。

调用命名空间中的变量:

想要指定调用的变量不是库里的,也不是全局的,而是命名空间里的。我们用到域作用限定符(::)

#include <stdio.h>
#include <stdlib.h>
namespace shunshun
{
	int rand = 0;
	struct Node
	{
		struct Node* next;
		int val;
	};
}
int main()
{
	//访问的是库函数的地址
	printf("%p\n", rand);
	//访问的是我们想访问的rand变量
	printf("%d\n", shunshun::rand);//::为域作用限定符
	struct shunshun::Node node;//域作用限定符不可以加在struct前面,要加在结构名前面。
	return 0;
}

但是,每次这样访问有些麻烦,怎样简化?

展开(授权)功能:

展开又分为全部展开部分展开

全部展开是将命名空间中的每个变量的权限解开,可以访问。

部分展开是将命名空间中的部分变量的权限解开。

部分展开:

using shunshun::rand;

意思是,调用rand变量时,默认调的是shunshun这个命名空间里的rand变量。

全部展开:

using namespace shunshun;

这时,命名空间中所有的变量都可以别访问,存在安全风险,所以一般的大型项目是不会全部展开的!

同时我们就可以解释开头的那句话了:

using namespace std;

std是C++的一个标准库,这个标准库里的函数是定义在一块命名空间里的。如果,单纯的通过头文件把库引过来,等到头文件展开时(把头文件里的内容拷贝,替换这行头文件),这个库里的函数是呆在一个命名空间中的,如果,不写这句话(using namespace std;),那么我们就不能用这个标准库的函数。所以,这句话就是为我们使用C++标准库里的函数做准备的。

套娃功能:

这个命名空间是可以嵌套的

namespace shunshun
{
	int rand = 0;
	struct Node
	{
		struct Node* next;
		int val;
	};

    namespace lili
    {
       int love = 720;
    }
}

调用时,如果我们想用这里的love变量,就得写两层域作用限定符——shunshun::lili::love。

自动合并功能:

如果,我们定义了两个或多个相同名称的命名空间,这时也不会报错,命名空间是可以自动合并的(这些相同名称的命名空间可以在同一个工程下的不同文件中的),但是如果这些同名的命名空间中定义了相同名称的变量或者函数(比如,两个shunshun命名空间中,都有rand这个变量),那这时就会发生冲突。

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

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

相关文章

电脑麦克风没声音?

这3招就可以解决&#xff01; 在我们使用电脑录制视频时&#xff0c;有时会遇到一个令人头疼的问题&#xff1a;麦克风没有声音。那么&#xff0c;为什么会出现这种情况呢&#xff1f;更重要的是&#xff0c;我们应该如何解决这个问题呢&#xff1f;本文将介绍3种方法&#xf…

MySQL 中的 Hash 索引

Hash 本身是一个函数&#xff0c;又被称为散列函数&#xff0c;它可以帮助我们大幅提升检索数据的效率。打个比方&#xff0c;Hash 就好像一个智能前台&#xff0c;你只要告诉它想要查找的人的姓名&#xff0c;它就会告诉你那个人坐在哪个位置&#xff0c;只需要一次交互就可以…

【Cocos Creator 项目实战 】消灭星星加强版(附带完整源码工程)

本文乃Siliphen原创&#xff0c;转载请注明出处 目录 概述 游戏整体流程 游戏框架设计 单一职责的类 主要流程控制类 核心玩法模块 UI&#xff1a; 游戏世界&#xff1a; 本文项目的代码组织结构 作者项目实践总结 场景只有一个入口脚本 尽量少在节点上挂载脚本 构…

四级以内的单词

单词 第一单元 excuse&#xff0c;me&#xff0c;yes&#xff0c;is&#xff0c;this&#xff0c;your&#xff0c;handbag&#xff0c;pardon&#xff0c;it&#xff0c;thank&#xff0c;you&#xff0c;very&#xff0c;much&#xff0c;pen&#xff0c;pencil&#xff0c…

模拟量电流电压采集软件使用教程

一.启动模拟量采集系统。打开软件需要登录用户 二.主界面是采集监控界面&#xff0c;每组采集柜设置采集不同产品和参数&#xff0c;选中产品判断设备连接状态和设置输出产品电压。 三.扫描每组柜的产品电流电压数据&#xff0c;判断每组柜哪些通道放了采集产品&#xff0c;扫描…

【云原生】K8S集群

目录 一、调度约束1.1 POT的创建过程1.1调度过程 二、指定节点调度2.1 通过标签选择节点 三、亲和性3.1requiredDuringSchedulingIgnoredDuringExecution&#xff1a;硬策略3.1 preferredDuringSchedulingIgnoredDuringExecution&#xff1a;软策略3.3Pod亲和性与反亲和性3.4使…

分支和循环语句(2)(C语言)

目录 do...while()循环 do语句的语法 do语句的特点 do while循环中的break和continue 练习 goto语句 do...while()循环 do语句的语法 do 循环语句; while(表达式); do语句的特点 循环至少执行一次&#xff0c;使用的场景有限&#xff0c;所以不是经常使用。 #inc…

C#导入数据使用Task异步处理耗时任务

C#多线程中&#xff0c;我们可以使用async和await来异步处理耗时任务。 现在我们打开一个Excel表格&#xff0c;将Excel表格的每一行数据进行处理&#xff0c;并存储到数据库中 新建Windows应用程序DataImportDemo&#xff0c;.net framework 4.6.1 将默认的Form1重命名为Fo…

js防止F12扒数据

添加 js 代码防止F12扒数据 ((function() {var callbacks [],timeLimit 50,open false;setInterval(loop, 1);return {addListener: function(fn) {callbacks.push(fn);},cancleListenr: function(fn) {callbacks callbacks.filter(function(v) {return v ! fn;});}}funct…

面试八股文Mysql:(1)事务实现的原理

1. 什么是事务 事务就是一组数据库操作&#xff0c;这些操作是一个atomic&#xff08;原子性的操作&#xff09; &#xff0c;不可分割&#xff0c;要么都执行&#xff0c;要么回滚&#xff08;rollback&#xff09;都不执行。这样就避免了某个操作成功某个操作失败&#xff0…

藏语翻译器:藏语翻译小助手

这是一款翻译功能齐全的翻译软件&#xff0c;主打藏语翻译功能&#xff0c;同时具备文字翻译、图片翻译、音频翻译、视频翻译、文档翻译等热门功能&#xff0c;支持将翻译结果导出为可编辑的文本文档&#xff0c;方便后续编辑整理。支持朗读原文和译文&#xff0c;帮助我们学习…

LeetCode209. 长度最小的子数组

题目&#xff1a;LeetCode209. 长度最小的子数组 描述&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子…

Grafana Prometheus 通过JMX监控kafka

第三方kafka exporter方案 目前网上关于使用Prometheus 监控kafka的大部分资料都是使用一个第三方的 kafka exporter&#xff0c;他的原理大概就是启动一个kafka客户端&#xff0c;获取kafka服务器的信息&#xff0c;然后提供一些metric接口供Prometheus使用&#xff0c;随意它…

【React学习】—函数式组件(四)

【React学习】—函数式组件&#xff08;四&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><ti…

17.电话号码的字母组合(回溯)

目录 一、题目 二、代码 一、题目 17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution {const char*data[10]{"","","abc","def","ghi","jkl","mno","pq…

解决nvm安装后,node生效但npm无效

问题描述 nvm安装后&#xff0c;node生效但npm无效 清除缓存 C:\Users\cc\AppData\Roaming cc是我的用户名改成你自己的就行删除 npm和npm-cache

pdf怎么删除不要的页面?这几种删除方法了解一下

pdf怎么删除不要的页面&#xff1f;在处理pdf文档时&#xff0c;我们经常会遇到需要删除某些页面的情况。一些多余或无关的页面可能会对文档的整体结构造成混乱&#xff0c;甚至会影响文档的可读性。此外&#xff0c;删除多余页面还可以减小文件大小&#xff0c;方便存储和传输…

B2B2C多用户商城系统--多店铺商城系统源码搭建

要搭建一个B2B2C多用户商城系统&#xff0c;需要以下几个步骤&#xff0c;包括系统设计、数据库设计、前端设计和后端设计。 1. 系统设计 在系统设计阶段&#xff0c;需要确定系统的基本架构和功能模块。以下是系统设计的一些要点&#xff1a; 采用敏捷开发流程&#xff0c;…

微服务03-RabbitMQ

1、简介 MQ,中文是消息中间件(队列)(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。 简单来说,消息中间件就是指保存数据的一个容器(服务器),可以用于两个系统之间的数据传递。 几种常见MQ的对比: RabbitMQActiveMQRocketMQKafka公司…