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 就不能展开命名空间,就用不了这个库中的内容。

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


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++(14)——string的模拟实现

前几篇文章中介绍了关于以及其相关函数的使用&#xff0c;为了更清楚的了解这些函数的作用&#xff0c;本篇文章通过模拟实现的方式来加深对于函数作用原理的理解。 目录 1. String的整体框架&#xff1a; 1.1 成员变量&#xff1a; 1.2 构造函数&#xff1a; 1.3 析构函数…

第十一站:多态练习ODU

实现动态切换 ODU.h #pragma once #include <iostream> using namespace std; #define ODU_TYPE_311_FLAG "311" #define ODU_TYPE_335_FLAG "335" enum class ODU_TYPE {ODU_TYPE_311,ODU_TYPE_335,ODU_TYPE_UNKNOW };class ODU{ public:ODU();//发…

Elasticsearch的映射操作

本文来记录下Elasticsearch的映射操作 文章目录 映射的概述 映射的概述 Elasticsearch与mysql数据库对比 映射的概述 有了索引库&#xff0c;等于有了数据库中的 database。索引库(index)中的映射&#xff0c;类似于数据库(database)中的表结构(table)。创建数据库表需要设置字…

SpringBoot实现文件上传和下载实现全过程(值得珍藏)

1. 引言 在Web应用中&#xff0c;文件上传和下载是常见的需求。Spring Boot框架提供了强大的支持和便利的API&#xff0c;使得开发者可以轻松地实现文件上传和下载功能。本文将详细介绍如何在Spring Boot应用中实现文件上传和下载&#xff0c;包括实现原理和完整的代码示例。 …

【js】js 异步机制详解 Generator / Async / Promise

三种语法功能放在一起&#xff0c;是因为他们都有相似特点&#xff1a; 维护某种状态在未来恢复状态并执行 本文重点回答以下几个问题&#xff1a; 为什么 Generator 和 Async 函数的 代码执行流 都可以简化成树形结构&#xff1f;async 函数为什么返回一个 promise&#xf…

list下

文章目录 注意&#xff1a;const迭代器怎么写&#xff1f;运用场合&#xff1f; inserterase析构函数赋值和拷贝构造区别&#xff1f;拷贝构造不能写那个swap,为什么&#xff1f;拷贝构造代码 面试问题什么是迭代器失效&#xff1f;vector、list的区别&#xff1f; 完整代码 注…

3、非数值型的分类变量

非数值型的分类变量 有很多非数字的数据,这里介绍如何使用它来进行机器学习。 在本教程中,您将了解什么是分类变量,以及处理此类数据的三种方法。 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 文章目录 1、简介2、三种方法的使用1…

idea运行卡顿优化方案

文章目录 前言一、调整配置1. idea.properties2. idea.vmoptions3.heap size4.Plugins5.Inspections 总结 前言 本人电脑16G内存&#xff0c;处理器i7 10代&#xff0c;磁盘空间也够用&#xff0c;整体配置够用&#xff0c;但运行idea会很卡&#xff0c;记录优化过程&#xff…

Linux中关于head命令详解

head的作用 head用于查看文件的开头部分的内容。 head的参数 -q隐藏文件名-v 显示文件名-c<数目>显示的字节数-n<数目>显示的行数 head的案例 # 查看yum.log前五行内容 head -5 yum.log

文件操作和IO(1)

认识文件 先来认识狭义上的文件(存储在硬盘(磁盘)上).针对硬盘这种持久化的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般. 注意:硬盘 ! 磁盘 磁盘属于…

1885_Arduino 1306 OLED屏幕的使用

全部学习汇总&#xff1a; g_arduino: Arduino hack笔记 (gitee.com) 以前我基于Arduino做过一个环境信息采集的小工具&#xff0c;采集到的信息存储到SD卡中。当时的笔记&#xff1a; 341_Arduinopython分析天气变化导致颈椎病发的原因_颈椎病相关数据分析python-CSDN博客 以前…

Jan AI本地运行揭秘:首次体验,尝鲜科技前沿

&#x1f31f;&#x1f30c; 欢迎来到知识与创意的殿堂 — 远见阁小民的世界&#xff01;&#x1f680; &#x1f31f;&#x1f9ed; 在这里&#xff0c;我们一起探索技术的奥秘&#xff0c;一起在知识的海洋中遨游。 &#x1f31f;&#x1f9ed; 在这里&#xff0c;每个错误都…

关于Hive架构原理,尚硅谷

最近学习hive 时候&#xff0c;在做一个实操案例&#xff0c;具体大概是这样子的&#xff1a; 我在dataGip里建了一个表&#xff0c;然后在hadoop集群创建一个文本文件里面存储了数据库表的数据信息&#xff0c;然后把他上传到hdfs后&#xff0c;dataGrip那个表也同步了我上传到…

gin渲染篇

1. 各种数据格式的响应 json、结构体、XML、YAML类似于java的properties、ProtoBuf package mainimport ("github.com/gin-gonic/gin""github.com/gin-gonic/gin/testdata/protoexample" )// 多种响应方式 func main() {// 1.创建路由// 默认使用了2个中…

java idea 中的 Scratches and Consoles

IDEA 中&#xff0c;"Scratches and Consoles" 是一个用于临时代码编辑和交互式开发的工具窗口&#xff0c;作用如下&#xff1a;Scratches&#xff08;草稿&#xff09;&#xff1a;Scratches 是一个用于临时编写和运行代码片段的工具&#xff0c;你可以在其中创建临…

四.Winform使用Webview2加载本地HTML页面并互相通信

Winform使用Webview2加载本地HTML页面并互相通信 往期目录本节目标核心代码实现HTML代码实现的窗体Demo2代码效果图 往期目录 往期相关文章目录 专栏目录 本节目标 实现刷新按钮点击 C# winform按钮可以调用C# winform代码显示到html上点击HTML按钮可以调用C# winform代码更…

2024首更---Web Service 教程

Web Services 简介 Web Services 可使您的应用程序成为 Web 应用程序。 Web Services 通过 Web 进行发布、查找和使用。 您应当具备的基础知识 在继续学习之前&#xff0c;您需要对下面的知识有基本的了解&#xff1a; HTMLXML 如果您希望首先学习这些项目&#xff0c;请在…

万户 ezOFFICE wf_process_attrelate_aiframe.jsp SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

lv14 信号量、互斥锁、并发控制机制选择

1 信号量&#xff1a;基于阻塞的并发控制机制 a.定义信号量 struct semaphore sem; b.初始化信号量 void sema_init(struct semaphore *sem, int val); c.获得信号量P int down(struct semaphore *sem);//深度睡眠 int down_interruptible(struct semaphore *sem);//浅度…

【Linux】python版本控制

文章目录 1.查看目前python的版本2.添加软件源并更新3.选择你想要下载的版本4.警示&#xff1a;没必要设置默认版本误区千万千万不要覆盖python3软链接解决办法 5.安装pip换源 6.环境管理 网上有很多教程都是教导小白去官方下载之后编译安装。但是&#xff0c;小白连cmake是什么…