【C++】1. 命名空间

这篇具有很好参考价值的文章主要介绍了【C++】1. 命名空间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、命名空间的由来

当我们使用c语言编写项目时,可能遇到以下情况:

  1. 变量名与某个库函数名重复,导致保错。这种情况一般是自己不知道引用的头文件包含哪些库函数。

【C++】1. 命名空间
2. 和队友一起编写项目时,自己使用的标识符和队友的标识符名字一样,导致代码整合时发生错误。这种情况很难避免,毕竟一些常用的命名习惯是大家都有的,那这个时候怎么办呢?总不能打一架来争夺命名权。
【C++】1. 命名空间
基于这样的问题,c++的创造者创造了命名空间。

当多个库或代码文件被组合在一起时,可能会出现相同名称的变量、函数、类等,这种情况称为“命名冲突”。命名空间可以在不改变原有代码的情况下,将标识符放在特定的作用域中,以避免命名冲突。


二、命名空间的使用

上面提到,命名空间通过将标识符放在特定的作用域来解决命名冲突。这里出现一个名词:作用域。学过c语言的人应该都知道这个概念。

作用域是指在程序代码中,标识符有效的区域或范围。在作用域内,标识符可以被使用或修改,而在其它作用域内则可能无法访问该标识符。

变量只有在它的作用域里才能发挥它的作用。局部变量只能在局部域发挥作用,全局变量只有在全局域才能发挥作用。
由于作用域的存在,请问以下代码会发生命名冲突吗?
【C++】1. 命名空间
不会!因为两个a不在同一个域中。
编译器在使用a这个标识符时,一般按照以下顺序去寻找a:局部域->全局域。


因此我们按照这样的思路,来创建一个命名空间域存放我们设置的标识符。

2.1 关键字:namespace

namespace的使用如下:
【C++】1. 命名空间
此时sfw里的a就不会与sfw域外面的a产生冲突。
命名空间内部可以包含结构体,函数……


2.2 访问命名空间里的标识符

上面提到编译器查找标识符的顺序是 :局部域->全局域。
现在我们创建了sfw这个命名空间,那编译器此时访问顺序会变成什么?不变,因为编译器不会主动去访问命名空间里的内容。
【C++】1. 命名空间
那我们怎么访问命名空间里的标识符呢?有三种方法。

  1. 展开命名空间:通过使用using这个关键字,如下图
    【C++】1. 命名空间
    注意:展开命名空间相当于把这个命名空间暴露在全局域当中。
    这就意味着:如果此时全局域有一个标识符和sfw命名空间里一个标识符相同,则会发生命名冲突。如下图,因此不推荐这种玩法。
    【C++】1. 命名空间
    补:using namespace sfw;需要在sfw这个命名空间创建后才能使用,如果这句代码在namespace sfw {……}上面,则会报错

  1. 使用作用域限定符::来访问命名空间里的标识符 : 命名空间名字+::+标识符,如下图
    【C++】1. 命名空间
    这种方式就不用担心展开命名空间造成的错误了,因此这种方式往往是大型团队项目的使用方式

  1. 展开命名空间的某一部分:using + namespace + 命名空间的名字 + :: + 标识符
    【C++】1. 命名空间
    这种方式仍有展开命名空间相同的错误,比如此时刚好有个全局变量是a,一样也会报错。个人还是推荐第二种方式。

2.3 命名空间的特点

我们已经知道了如何创建和访问命名空间,下面我们来学习命名空间的一些特点。

  1. 命名空间的嵌套:一个命名空间可以包含另一个一个命名空间
    【C++】1. 命名空间

  2. 命名空间的合并
    请问:命名空间会发生命名冲突吗?即我创建了一个命名空间:sfw,你也创建了一个命名空间:sfw。
    答:冲了但也没冲。编译器会将相同名字的命名空间合在一起,如果这两个命名空间都定义了相同的标识符,则发生冲突。
    【C++】1. 命名空间


三、总结

命名空间是C++中用来避免命名冲突的一种机制。创建和使用命名空间的方法如下:

创建命名空间:在全局或其他命名空间的作用域内,使用关键字namespace加上命名空间的名称来创建一个命名空间,例如:

namespace my_namespace {
   // 命名空间的定义内容
}

命名空间中可以定义变量、函数、类等标识符,并给他们都加上该命名空间的前缀。例如:

namespace my_namespace {
    int my_var = 0;  // 定义命名空间内的变量
    void my_function() {  // 定义命名空间内的函数
        // 函数代码
    }
    class MyClass {  // 定义命名空间内的类
        // 类定义
    };
}

使用命名空间:在使用命名空间内的标识符时,需要在其前面加上命名空间的名称和作用域限定符(::),例如:

my_namespace::my_var = 100;   // 使用 my_namespace 命名空间内的变量
my_namespace::my_function();  // 调用 my_namespace 命名空间内的函数
my_namespace::MyClass obj;    // 使用 my_namespace 命名空间内的类

可以使用using关键字引入命名空间中的标识符,使得在该作用域内可以直接使用该标识符而不需要加上命名空间前缀。例如:

using my_namespace::my_var;
my_var = 100;   // 直接使用 my_var,无需加上命名空间前缀

命名空间的使用可以避免不同模块或工程中使用同名标识符导致的冲突问题,同时也便于代码维护和阅读。文章来源地址https://www.toymoban.com/news/detail-412586.html

到了这里,关于【C++】1. 命名空间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 13、c++使用单例模式实现命名空间函数

    本案例实现一个test命名空间,此命名空间内有两个函数,分别为getName()和getNameSpace(); 声明命名空间及函数 命名空间内实现单例类 实现一个单例类,构造函数要为private,自身对象为private 静态成员函数(才可以调用静态成员变量) 实现命名空间函数 首先调用的是类的静态

    2023年04月23日
    浏览(47)
  • 计算机语言 之【C++】入门级知识讲解(命名空间,C++输入输出,缺省参数,函数重载,引用,内敛函数,auto关键字,for循环,指针空值nullptr)

    三点睡六点起,阎王夸我好身体 不到三点我不睡,太平间里抢C位 目录: 前言: 本片博客是以学习过C语言之后进入C++学习为前提,讲解C++入门级知识,为C++之后的学习做铺垫 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀

    2024年04月11日
    浏览(129)
  • 【C++】命名空间详解

    目录 前言 命名空间的定义  命名空间的使用 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。 使用命名空间的目的是对标识符的名称进行本地化 , 以 避免命名冲突或名字污染 ,namespa

    2024年01月25日
    浏览(74)
  • C++——命名空间(namespace)

    目录 1. C语言命名冲突 2. 命名空间定义 3. 命名空间使用 可能大家在看别人写的C++代码中,在一开始会包这个头文件:#includeiostream 这个头文件等价于我们在C语言学习到的#includestdio.h,它是用来跟我们的控制台输入和输出的,这里简要提下,后续详谈。 除了上面这个头文件,

    2024年02月10日
    浏览(41)
  • C++ :命名空间域

    目录 冲突与命名: 举个例子: 全局与局部: 域作用限定符:  命名空间域: 命名空间域的使用方式:  加命名空间名称及作用域限定符 使用using将命名空间中某个成员引入 使用using namespace 命名空间名称 引入  嵌套使用 在C语言中,我们通常会使用stdlib.h  而stdlib.h 本质上

    2024年01月22日
    浏览(39)
  • 【C++】1. 命名空间

    当我们使用c语言编写项目时,可能遇到以下情况: 变量名与某个库函数名重复,导致保错。这种情况一般是自己不知道引用的头文件包含哪些库函数。 2. 和队友一起编写项目时,自己使用的标识符和队友的标识符名字一样,导致代码整合时发生错误。这种情况很难避免,毕

    2023年04月13日
    浏览(101)
  • 【C++】入门 --- 命名空间

    本篇文章是《C++ 初阶》 专栏的第一篇文章,从本专栏开始就进入了C++的学习了哦!本篇的内容是C++入门:命名空间的学习希望烙铁们可以理解消化哦🥰!!! 🚩C++是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由 本贾尼·斯特劳斯特卢普在ATT贝尔

    2024年02月16日
    浏览(32)
  • 【C++】命名空间 ( namespace )

    命名空间是一种用来避免命名冲突的机制,它可以将一段代码的名称隔离开,使其与其他代码的名称不冲突; 命名空间的原理是将一个全局的作用域分成一个个命名空间,每个命名空间是个单独的作用域,同时若是在同一个作用域内可能出现的命名冲突也不会造成影响,有效

    2024年02月04日
    浏览(37)
  • 【C++】namespace 命名空间

    两个术语: 声明区域:声明区域是可以在其中进行声明的区域。 潜在作用域:变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量必须定义后才能使用。 名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代

    2023年04月08日
    浏览(38)
  • 【C++ 记忆站】命名空间

    在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace的出现就是针对这种问题的。 很多人在开

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包