C++ :命名空间域

目录

冲突与命名:

举个例子:

全局与局部:

域作用限定符:

 命名空间域:

 

冲突与命名:

在C语言中,我们通常会使用stdlib.h 

而stdlib.h 本质上是一个函数的库,在程序中使用的大多数函数都来自于stdlib.h

但是,当使用久了便会发现一个问题,那便是命名冲突!

举个例子:

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

结果显而易见,因为rand在stdlib.h中是一个函数,所以在使用stdlib.h将程序进行扩展后,你命名的变量极有可能会因为和函数名重复,而造成冲突,但我们又不明白那些是函数,那些又不是函数,所以,这个问题一直是C语言的不足之处!

全局与局部:

在之前的学习中,我们得知当一个变量名同时为全局变量和局部变量时,编译器则优先选择局部变量,也就是所谓的就近原则。

这其实和编译器的工作原理有关,编译器在查看到变量的存在的同时,会在局部区域内搜寻变量的存在,若该变量不存在于局部区域,编译器则会从全局的范围内搜寻变量是否存在,如果还是不存在,则编译器发生报错。

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

但是当我们不想要使用局部变量进行打印,想要使用全局变量进行打印和使用时,又该怎么办呢?

域作用限定符:

:: 作为域作用限定符,:: 的左边写域名,而右边则写变量名,当左边为空时,默认为全局变量。

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

使用域作用限定符后,打印出的结果便是我们想要的全局变量。

而域作用限定符的工作原理就是在编译器进行搜索前给编译器指定一块搜索区域,也就是让编译器在指定的区域内部搜索,若得出结果则停下,得不到则继续遵循就近原则。

 命名空间域:

通过域作用限定符我们可以在局部变量名和全局变量名重名时使用全局变量名,但仅仅只是如此吗?

当然不是,为了更方便的使用域作用限定符或者说更好的调用其他范围内的变量,我们可以才用命名空间域

namespace 空间名{}

 如上代码所示,命名空间域的作用就是将需要调用的变量封装起来,并且定义空间的名字,方便摆放在 域作用限定符的 左边 以便使用。

#include<stdio.h>
#include<stdlib.h>namespace bit1 
{int x = 0;
}namespace bit2
{int x = 1;
}int main ()
{ printf("%d\n",bit1::x);printf("%d\n",bit2::x);return 0;
}

 而且命名空间域可以将内部的变量和外部进行隔离,这使得在同一个区域内,即使变量名一样,它们也不会发生报错,因为它们分别被命名空间域封装了。

当然命名空间域的作用不止如此,它的内部还可以存放其他函数,或者结构体。

#include<stdio.h>
#include<stdlib.h>namespace bit1 
{int x = 0;int ADD (int left , int right){return left+right;}
}namespace bit2
{int x = 1;struct Node {struct Node * next;int val;}
}int main ()
{ printf("%d\n",bit1::x);printf("%d\n",bit2::x);//使用ADD函数printf("%d\n",bit1::ADD(1,2));//定义结构体变量struct bit2::Node phead;return 0;
}

但是,命名空间的写法不是很方便,而且每次使用的时候都需要加上::和空间的名字

于是就有了一种全新的写法。

using namespace 空间名;

如果说,头文件是一种内容的拷贝复制,那么 using namespace 就是一种权限的打开。

使用了 using namespace 就意味着,它身后的空间名允许访问,并且在通常的情况下,使用了usiing namespace 的命名空间域,它内部的变量就相当于全局变量.

#include<iostream>using namespace std;int main()
{cout << "hello world"<< endl;return 0;
}
  • std : 这里面的std表示的是所有c++库的命名空间
  • <iostream> :这个是c++的命名库所在的文件名,但是它还被std这个命名空间封装了,所以如果不使用using namespace std 就不能展开命名空间,就用不了这个库中的内容。

如果不展开空间则只能使用这种方式:


 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java面试——juc篇

目录 一、线程基础 1、进程与线程的区别&#xff1f;&#xff08;⭐⭐⭐&#xff09; 2、并行和并发的区别&#xff08;⭐&#xff09; 3、创建线程的方式有哪些&#xff1f;&#xff08;⭐⭐⭐⭐&#xff09; runnable和Callable的区别&#xff1a; 线程中的run()和 star…

自然语言处理研究的内容

一.基础技术 1.1 词法分析 词法分析&#xff08;Lexical Analysis&#xff09;&#xff0c;也称为词法扫描或扫描器&#xff0c;是自然语言处理&#xff08;NLP&#xff09;中的基础步骤之一&#xff0c;用于将输入的文本分割成词法单元&#xff08;Token&#xff09;。词法单…

条件风险价值CVaR内容介绍(MATLAB例程)

在对微电网优化调度过程中&#xff0c;由于新能源机组出力和负荷的不确定性&#xff0c;若采用确定性的优化调度方案会存在一定的风险。当风电和光伏输出功率的实际值低于预测值时&#xff0c;需要增加可控机组出力或切除部分负荷&#xff1b;反之&#xff0c;若风电和光伏输出…

php array_diff 比较两个数组bug避坑 深入了解

今天实用array_diff出现的异常问题&#xff0c;预想的结果应该是返回 "integral_initiate">"0"&#xff0c;实际没有 先看测试代码&#xff1a; $a ["user_name">"测","see_num">0,"integral_initiate&quo…

数据操作——缺失值处理

缺失值处理 缺失值的处理思路 如果想探究如何处理无效值, 首先要知道无效值从哪来, 从而分析可能产生的无效值有哪些类型, 在分别去看如何处理无效值 什么是缺失值 一个值本身的含义是这个值不存在则称之为缺失值, 也就是说这个值本身代表着缺失, 或者这个值本身无意义, 比如…

Hylicos - MINI2440 - 中断控制

中断 中断源管理 中断是一种异步异常&#xff0c;CPU需要处理很多来自设备的中断请求&#xff0c;而CPU引出的line只有IRQ线和FIQ线&#xff0c;所以就得引入中断控制器帮助CPU搞清楚是中断的来源。 MINI2440的中断控制器&#xff0c;可以接受来自60个中断源的请求。提供这些…

MySQL面试总结

MySQL优化 1.MySQL如何定位慢查询 1.1开源工具 1.2MySQL自带慢日志 1.3解答 2.EXPLAIN 2.1解答 3.什么是索引 4.B树 4.1数据结构对比 5.聚簇索引&#xff08;聚集索引&#xff09; 6.覆盖索引 7.索引创建原则 8.什么情况下索引失效 9.你对sql优化经验 10.事务 11.MVCC 11.主从…

开源堡垒机JumpServer本地安装并配置公网访问地址

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

Python多线程爬虫——数据分析项目实现详解

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言爬虫获取cookie网站爬取与启动CS…

Spring boot项目java bean和xml互转

Spring boot项目实现java bean和xml互转 项目场景&#xff1a;互转方法使用jackson进行互转使用jaxws进行xml与bean的互转 搞定收工&#xff01; 项目场景&#xff1a; 工作中需要给下游第三方收费系统做数据挡板&#xff0c;由于下游系统使用的是soap webservice,里面涉及各种…

牛客周赛 Round 21 解题报告 | 珂学家 | 堆栈的妙用

前言 整体评价 从A题中的Baidu, 可以猜到这场有几道题来自于百度校招。 其实B题有点意思&#xff0c;如果把十字星的范围放大&#xff0c;那就可以成为一个hard题。 D题也挺意思的&#xff0c;大概有两种思路&#xff0c;一种是从左到右枚举右端点&#xff0c;增量累加&…

【C/C++】C/C++编程——为什么学习 C++?

当提到C的时候&#xff0c;很多人会觉得语法复杂、学习曲线陡峭&#xff0c;并且好像与C语言还有点"纠缠不清"。尽管如此&#xff0c;C仍然是当今世界上最受欢迎和最有影响力的编程语言之一。特别是在当今快速发展的人工智能&#xff08;AI&#xff09;领域&#xff…

利用GPU加速自定义风格图像生成-利用GPU加速结合了ControlNet/ Lora的Stable Diffusion XL

点击链接完成注册&#xff0c;参加本次在线研讨会 https://www.nvidia.cn/webinars/sessions/?session_id240124-31319 随着AI技术的发展, 数字内容创建业务也变得越来越火热。生成式AI模型的发布, 让我们看到了人工智能在各行各业的潜力。您只需要用语言简单描述自己希望看…

黑马苍穹外卖学习Day10

文章目录 Spring Task介绍cron表达式入门案例 订单状态定时处理需求分析代码开发功能测试 WebSocket介绍入门案例 来单提醒需求分析代码开发 客户催单需求分析代码开发 Spring Task 介绍 cron表达式 入门案例 订单状态定时处理 需求分析 代码开发 新建一个task包里面编写代码…

REVIT二次开发批量编号

步骤1 步骤2 步骤3 实现代码using System; using System.Collections.Generic; using System.Linq; using Syste

《Python数据分析技术栈》第03章 03 可视化各级数据(Visualizing various levels of data)

03 可视化各级数据&#xff08;Visualizing various levels of data&#xff09; 《Python数据分析技术栈》第03章 03 可视化各级数据&#xff08;Visualizing various levels of data&#xff09; Whenever you need to analyze data, first understand if the data is stru…

C++三剑客之std::variant(二):深入剖析

目录 1.概述 2.辅助类介绍 2.1.std::negation 2.2.std::conjunction 2.3.std::is_destructible 2.4.std::is_object 2.5.is_default_constructible 2.6.std::is_trivially_destructible 2.7.std::in_place_type和std::in_place_index 3.原理分析 3.1.存储分析 3.2.…

【蓝桥杯EDA设计与开发】资料汇总以及立创EDA及PCB相关技术资料汇总(持续更新)

[18/01/2024]&#xff1a;目前为了准备蓝桥杯做一些资料贴&#xff0c;于是写下这一篇博客。 各种资料均来源于网络以及部分书籍、手册等文档&#xff0c;参考不保证其准确性。 如果在准备蓝桥杯&#xff0c;可与我私信共同学习&#xff01;&#xff01;&#xff01;&#xf…

SCTP, TCP, UDP, IP, ICMP都在哪一层?(TCP/IP网络通信协议学习)

TCP/IP网络通信协议最早是由罗伯特卡恩&#xff08;Robert E. Kahn&#xff09;和文顿瑟夫&#xff08;Vinton G. Cerf&#xff09;于1972年提出的&#xff0c;它是一个实际的协议栈。 OSI七层网络通信协议最早是由国际标准化组织&#xff08;ISO&#xff09;于1977年提出的&am…

0基础转行做软件测试?一文教小白拿到初级岗位offer?

我认为入门软件测试需要四个方面的知识or技能&#xff0c;它们是&#xff1a;业务知识、职业素养、基础知识、技术知识。 职业素养是一切的根基&#xff0c;因为人在职场就必须拥有必要的职业素养&#xff0c;软件测试工程师也不例外。基础知识和技术知识是两大支柱&#xff0…