当前位置: 首页 > news >正文

C++——关于命名空间

写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这个变量),那这时就会发生冲突。

相关文章:

C++——关于命名空间

写c项目时&#xff0c;大家常用到的一句话就是&#xff1a; using namespace std; 怎么具体解析这句话呢&#xff1f; 命名冲突&#xff1a; 在c语言中&#xff0c;我们有变量的命名规范&#xff0c;如果一个变量名或者函数名和某个库里面自带的库函数或者某个关键字重名&…...

怎么进行流程图制作?用这个工具制作很方便

怎么进行流程图制作&#xff1f;流程图是一种非常有用的工具&#xff0c;可以帮助我们更好地理解和展示各种复杂的业务流程和工作流程。它可以将复杂的过程简化为易于理解的图形和文本&#xff0c;使得人们更容易理解和跟踪整个流程。因此&#xff0c;制作流程图是在日常工作中…...

【ChatGPT 指令大全】怎么使用ChatGPT来辅助学习英语

在当今全球化的社会中&#xff0c;英语已成为一门世界性的语言&#xff0c;掌握良好的英语技能对个人和职业发展至关重要。而借助人工智能的力量&#xff0c;ChatGPT为学习者提供了一个有价值的工具&#xff0c;可以在学习过程中提供即时的帮助和反馈。在本文中&#xff0c;我们…...

Ubuntu20配置仅主机网络

Ubuntu20配置仅主机网络&#xff0c;使虚拟机与物理机网络联通且配置固定IP 进入终端&#xff1a;vim /etc/netplan/01-network-manager-all.yaml 修改为&#xff1a; network:ethernets:enp0s8:addresses: [192.168.138.108/24]dhcp4: false optional: truegateway4: 192.…...

调整奇数偶数顺序

调整数组使奇数全部都位于偶数前面。 题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 思路&#xff1a; 1. 给定两个下标left和right&#…...

日志的规范

确定日志级别&#xff1a; 确保你的系统有一个明确的日志级别策略。通常&#xff0c;日志级别包括DEBUG&#xff0c;INFO&#xff0c;WARN&#xff0c;ERROR和FATAL。DEBUG级别的日志记录所有详细信息&#xff0c;适用于开发和调试环境。INFO级别的日志记录常规操作信息&#x…...

Spring AOP(AOP概念,组成成分,实现,原理)

目录 1. 什么是Spring AOP&#xff1f; 2. 为什么要用AOP&#xff1f; 3. AOP该怎么学习&#xff1f; 3.1 AOP的组成 &#xff08;1&#xff09;切面&#xff08;Aspect&#xff09; &#xff08;2&#xff09;连接点&#xff08;join point&#xff09; &#xff08;3&a…...

Android WebView简单应用:构建内嵌网页浏览功能

在现代移动应用开发中&#xff0c;内嵌网页浏览功能是许多应用程序的常见需求。Android平台提供了WebView组件&#xff0c;它允许开发者将网页内容嵌入到应用中&#xff0c;并提供了丰富的功能和定制选项。本文将介绍如何在Android应用中使用WebView组件&#xff0c;帮助您快速…...

并发——乐观锁常见的两种实现方式,乐观锁的缺点

文章目录 乐观锁常见的两种实现方式1. 版本号机制2. CAS算法 乐观锁的缺点1 ABA 问题2 循环时间长开销大3 只能保证一个共享变量的原子操作 乐观锁常见的两种实现方式 乐观锁一般会使用版本号机制或CAS算法实现。 1. 版本号机制 一般是在数据表中加上一个数据版本号version字段…...

Spring 事务管理

目录 1. 事务管理 1.1. Spring框架的事务支持模型的优势 1.1.1. 全局事务 1.1.2. 本地事务 1.1.3. Spring框架的一致化编程模型 1.2. 了解Spring框架的事务抽象&#xff08;Transaction Abstraction&#xff09; 1.2.1. Hibernate 事务设置 1.3. 用事务同步资源 1.3.1…...

unity修改单个3D物体的重力的大小该怎么处理呢?

在Unity中修改单个3D物体的重力大小可以通过以下步骤实现&#xff1a; 创建一个新的C#脚本来控制重力&#xff1a; 首先&#xff0c;创建一个新的C#脚本&#xff08;例如&#xff1a;GravityModifier.cs&#xff09;并将其附加到需要修改重力的3D物体上。在脚本中&#xff0c…...

[Qt]FrameLessWindow实现调整大小、移动弹窗并具有Aero效果

说明 我们知道QWidget等设置了this->setWindowFlags(Qt::FramelessWindowHint);后无法移动和调整大小&#xff0c;但实际项目中是需要窗口能够调整大小的。所以以实现FrameLess弹窗调整大小及移动弹窗需求&#xff0c;并且在Windows 10上有Aero效果。 先看一下效果&#xf…...

【API生命周期看护】API日落

一、基本概念 在API的整个生命周期中&#xff0c;不可能是永远不变的。功能可能有变动、服务也可能有升级迭代&#xff0c;这个时候对外的能力入口&#xff1a;API自然也需要改变。 一般来说&#xff0c;API的变动是不可以引入兼容性问题的&#xff0c;也即不管做什么变动&am…...

PHP 使用ThinkPHP实现电子邮件发送示例

文章目录 首先我们需要设置我们的邮箱客户端授权&#xff0c;获取到授权码找到我们的邮箱设置去账号中找到这一堆服务&#xff0c;找到后开启smtp服务开启服务后管理服务 接下来需要去下载相应的第三方类库(我这里使用的是PHPMailer)在thinkPHP中封装一下邮件服务类实际调用效果…...

Leetcode-每日一题【剑指 Offer 18. 删除链表的节点】

题目 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。 返回删除后的链表的头节点。 注意&#xff1a;此题对比原题有改动 示例 1: 输入: head [4,5,1,9], val 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点&#xff0c;那么在调…...

[LINUX使用] top 命令的使用

COLUMNS150 LINES100 top 序号 是否为启动命令 命令模板 详解 1 no vh 帮助 2 yes -d 0.01 0.01秒的间隔刷新top输出 3 no c COMMAND列切换 4 yes -e [k | m | g | t | p] 以何种计量单位显示内存列 k-kb&#xff0c;m-mb&#xff0c;g-gb&#xff0c;t-t…...

通过redis进行缓存分页,通过SCAN扫描进行缓存更新

问题&#xff1a;当我们要添加缓存时&#xff0c;如果我们用了PageHelper时&#xff0c;PageHelper只会对查询语句有效&#xff08;使用到sql的查询&#xff09;&#xff0c;那么如果我们把查询到的数据都添加到缓存时&#xff0c;就会无法进行分页&#xff1b; 此时我们选择将…...

C#小轮子 Debug,Release,发布模式如何运行不同的代码

文章目录 前言C#运行模式运行模式介绍三种模式区分代码 前言 编译模式和发布模式的代码不一样是非常正常的。比较常见的是数据库不一样。编译测试数据库和发布真实的数据库地址不一样。 C#运行模式 运行模式介绍 运行模式有三种&#xff1a; Debug 不进行优化&#xff0c;…...

【【萌新的STM32 学习-6】】

萌新的STM32 学习-6 BSP 文件夹&#xff0c;用于存放正点原子提供的板级支持包驱动代码&#xff0c;如&#xff1a;LED、蜂鸣器、按键等。 本章我们暂时用不到该文件夹&#xff0c;不过可以先建好备用。 CMSIS 文件夹&#xff0c;用于存放 CMSIS 底层代码&#xff08;ARM 和 ST…...

“深入解析JVM:探索Java虚拟机的工作原理“

标题&#xff1a;深入解析JVM&#xff1a;探索Java虚拟机的工作原理 摘要&#xff1a;本文将深入解析Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;从字节码到执行过程&#xff0c;从内存模型到垃圾回收机制&#xff0c;逐步剖析JVM的核心组成部分和工作原理。…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...