【C++初阶】命名空间 namespace

news/2025/2/13 20:31:27/

目录

一.前言

二.命名冲突

三.命名空间  namespace

A.命名空间的定义

B.命名空间的使用

1.使用命名空间的目的

2.域

3.命名空间的三种使用方式

a.加命名空间名称及作用域限定符  (::)

b.使用using将命名空间中某个成员引入

c.使用using namespace 命名空间名称 引入

C.例子总结

三.一些小技巧


一.前言

在正式进入C++前,我们需要先了解了解C++。顾名思义,C++是基于C的一种编程语言,相较于C,C++写出来的代码更简洁,有时候C需要几百行代码,而C只需要几十行就可以解决,C++也很好的解决了C中存在的一些问题,例如:命名冲突。

C++的命名空间就能很好的解决这个问题。


二.命名冲突

在C语言中,我们定义的变量不能是库里有的,例如 int  printf  就不能这么定义,因为printf是库的函数,这样定义变量就会命名冲突

上图就很好的展示了这个错误。那库那么多,我们怎么保证当我们新加了一个头文件时,不会形成命名冲突呢?万一这个命名冲突又很多该怎么办?要全部改掉吗?

完全不需要,C++的命名空间可以完美解决这个问题。

 

三.命名空间  namespace

A.命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

例:

namespace  Eve   //命名空间的名字
{//命名空间的成员int a=10;int b=20;char d='a';
}     //注意这里没有分号

命名空间的成员可以是变量,函数,类型等;

命名空间可以嵌套定义

同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中;
ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个。

B.命名空间的使用

1.使用命名空间的目的

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染

2.域

域分为:

1.类域

2.命名空间域

3.全局域

4.局部域

它们的访问顺序一般是:局部域->全局域->展开的命名空间域  or  指定访问的命名空间域

3.命名空间的三种使用方式

a.加命名空间名称及作用域限定符  (::)

作用域限定符:“::”(即两个冒号);

使用格式:命名空间的名字::成员名

注:若::前是空白,则访问的是全局的成员

例:

namespace Eve
{int a=10;char b='a';
}int main()
{printf("%d  %c\n",Eve::a,Eve::b);   //访问命名空间内的成员return 0;
}

b.使用using将命名空间中某个成员引入

using可以理解为展开,展开后的命名空间或是命名空间中的成员将暴露在全局域下

例:

namespace Eve
{int a=10;int b=20;
}using  Eve::a;  //展开命名空间中的成员a,注意后面有分号int main()
{printf("%d\n",a);  //因为a已经展开了,所以可以直接使用return 0;
}

c.使用using namespace 命名空间名称 引入

例:

namespace Eve
{int a=10;int b=20;
}using  namespace Eve;  //展开整个命名空间,注意后面有分号int main()
{printf("%d\n",a);  //因为a已经展开了,所以可以直接使用return 0;
}

访问嵌套的命名空间的成员时:

 

 

C.例子总结

int a = 0;namespace Eve
{int a = 1;}//using namespace Eve;int main()
{int a = 2;printf("%d\n", a);printf("%d\n", ::a);printf("%d\n", Eve::a);return 0;
}

打印结果是什么呢?

如图所示:第一个printf 访问的是局部变量

                  第二个printf 访问的是全局变量

                  第三个printf 访问的是命名空间Eve里的a


三.一些小技巧

using  namespace  std;

上面这句代码是展开标准库(展开前要包含头文件<iostream>),但不能随意展开,有一定的风险,平常练习可以用用,做项目时建议不要展开。

还有一些我们常用的可以展开,比如cout,cin,endl等,这样更便捷。


🐬🤖本篇文章到此就结束了,这是博主的第一篇关于C++的文章,以后也会不断更新的,             若有错误或是建议的话,欢迎小伙伴们指出;🕊️👻

😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩

😍😁谢谢你的阅读。😸😼

 


http://www.ppmy.cn/news/41464.html

相关文章

运行时内存数据区之程序计数器

内存是非常重要的系统资源&#xff0c;是硬盘和CPU的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时选行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略&#xff0c;保证了JVM的高效稳定运行。 不同的VM对于内存的划分方式和管理机制存在着部分差…

运行时内存数据区之虚拟机栈——局部变量表

这篇内容十分重要,文字也很多,仔细阅读后,你必定有所收获! 基本内容 与程序计数器一样&#xff0c;Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;也是线程私有的&#xff0c;它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型&#xf…

Vision Transformers for Dense Prediction论文笔记

文章目录Vision Transformers for Dense Prediction&#xff0c; ICCV&#xff0c; 2021一、背景介绍二、网络结构三、实验结果1.语义分割实验2.消融实验Vision Transformers for Dense Prediction&#xff0c; ICCV&#xff0c; 2021 一、背景介绍 本篇论文主要提出一种网络…

tpm2-tools源码分析之tpm2_createprimary.c(3)

接前一篇文章&#xff1a;tpm2-tools源码分析之tpm2_createprimary.c&#xff08;2&#xff09; 本文对tpm2_createprimary.c中的tpm2_tool_onrun函数进行详细解析。 先再次贴出该函数源码&#xff1a; static tool_rc tpm2_tool_onrun(ESYS_CONTEXT *ectx, tpm2_option_flag…

js闭包处理

闭包&#xff08;closure&#xff09;是Javascript语言的一个难点&#xff0c;也是它的特色&#xff0c;很多高级应用都要依靠闭包实现。 闭包的作用:通过一系方法,将函数内部的变量(局部变量)转化为全局变量 一、变量的作用域 要理解闭包&#xff0c;首先必须理解Javascrip…

不良事件上报系统源码 有演示,已在多家医院运营多年

不良事件上报系统源码&#xff0c;医院安全不良事件管理系统源码 技术架构&#xff1a;前后端分离&#xff0c;仓储模式&#xff0c;BS架构&#xff0c;有演示&#xff0c;已在多家医院完美运营。 相关技术&#xff1a;PHPvscodevue2elementlaravel8mysql5.7 文末获取联系&am…

1.让自己习惯C++(条款1-4)

目录 条款01&#xff1a;视C为一个语言联邦 条款02&#xff1a;尽量以const&#xff0c;enum&#xff0c;inline替换#define 条款03&#xff1a;尽可能使用 const 条款04&#xff1a;确定对象被使用前已经被初始化 条款01&#xff1a;视C为一个语言联邦 可以将C的语言分为…

黑马点评Redis实战(短信登录;商户查询缓存)

黑马点评 通过一个类似于大众点评的项目了解学习redis在实战项目中的使用&#xff0c;下面是项目中会涉及到的模块&#xff1a; 一、导入黑马点评项目 导入springboot项目&#xff0c;导入sql脚本到数据库&#xff0c;开启nginx&#xff0c;更改项目配置文件中的redis和mys…