【C++】命名空间 ( namespace )

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


什么是命名空间

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


命名空间的作用

在学习C语言的过程中我们知道有一个函数叫做rand函数,该函数用于生成伪随机整数;

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

上面的代码在.c文件下的情况执行会得出什么结果
c++ namespace,C++,c++,开发语言

代码被运行成功且没有什么错误
但若是在包含rand函数所在的头文件为前提的结果是什么?
c++ namespace,C++,c++,开发语言

当包含了rand函数所在的头文件即报错;
原因是,在程序运行时,计算机先会在局部寻找变量,当局部内未找到时则回去全局找;
在全局找时找到了两个 rand (一个为头文件内的rand函数,一个为所创建的变量rand)
此时也不知该打印哪一个rand,这就叫命名冲突;

但在C++中,出现了一个新的概念叫做命名空间,一般来说,rand这类的函数都存放于C++中标准库类型对象的命名空间std中

若是在编译器中执行这段代码结果是什么;

#include<iostream>//标准输入输出流头文件
using namespace std;//展开标准库命名空间std

namespace Sweet{//设置命名空间且名为Sweet
	int rand = 10;
}

int main()
{
	cout << rand << endl;//打印rand
	cout << Sweet::rand << endl;//打印Sweet中的rand(::符号为作用域限定符)

	return 0;
}

c++ namespace,C++,c++,开发语言

打印出来的结果没有报错,原因是在这里并没有发生命名冲突,在这段代码中使用了

namespace Sweet{
	int rand = 10;
}

设置了一个名为Sweet的命名空间,且在命名空间内声明变量rand,在打印过程中就相当于虽然重名但是所在班级不同的学生;

但此时的rand仍然处于全局空间中,只是隐藏在名为Sweet的命名空间内;

若是运行下面的代码,则结果是什么?

#include<iostream>

using namespace std;
namespace Sweet{
	int rand = 10;
}
using namespace Sweet;
int main()
{
	cout << rand << endl;
	cout << Sweet::rand<<endl;

	return 0;
}

c++ namespace,C++,c++,开发语言
为什么上面的代码运行时并没报错而这段代码报错了?


如何定义命名空间

从上面可知命名空间的作用,既然命名空间能够有效防止命名冲突,那该如何定义命名空间

在定义命名空间时,应该使用 namespace 修饰且在该修饰词后定义名字
并在其后跟**{ }**
在{ }内的元素即为该命名空间的成员

#include<iostream>

using namespace std;//展开std命名空间

namespace A1 {//定义一个名为A1的命名空间
	int a = 0;
	int b = 20;//变量

	void Add()//函数
	{
		cout << "IsAddFunc1" << endl;
	}

	struct TestNode//结构体
	{
		int test1;
		double test2;
	};
}

namespace A2 {//定义一个名为A2的命名空间
	int a = 10;
	int b = 21;

	void Add()
	{
		cout << "IsAddFunc2" << endl;
	}

	struct TestNode
	{
		int test3;
		double test4;
	};
}
int main()
{
	cout << "A1::b = " << A1::b << endl;//打印A1中的b
	cout << "A2::b = " << A2::b << endl;//打印A2中的b

	A1::Add();//调用A1中的Add函数
	A2::Add();//调用A2中的Add函数

	struct A1::TestNode AT1;//声明结构体变量
	struct A2::TestNode AT2;

	cout << &AT1 << endl;//打印结构体变量地址
	cout << &AT2 << endl;

	return 0;
}

c++ namespace,C++,c++,开发语言

从该段代码可知命名空间内不仅可以声明(定义)变量,还可以包含函数、类、typedef以及#define宏等等


命名空间的种类

在一般情况下,命名空间还可以进行嵌套,即可以在一个命名空间内嵌再嵌套命名空间,以此类推;

c++ namespace,C++,c++,开发语言

#include<iostream>
using namespace std;
namespace A1{
	int mi = 0;
	int qi = 5;
	namespace A2 {
		int qi = 10;
		namespace A3 {
			int mi = 25;
		}
	}
}
int main()
{
	cout << "A1::mi = " << A1::mi << endl;
	cout << "A1::qi = " << A1::qi << endl;
	cout << "A1::A2::qi = " << A1::A2::qi << endl;
	cout << "A1::A2::A3::mi = " << A1::A2::A3::mi << endl;
	return 0;
}

该处A1命名空间内嵌套着A2A2嵌套A3

c++ namespace,C++,c++,开发语言

注意: 命名空间只能在全局范围定义!!

c++ namespace,C++,c++,开发语言

故上图的使用方法为错误方法

如何使用命名空间内的成员

既然命名空间可以防止发生命名冲突,那放在命名空间的成员应该如何使用?

作用域限定符

在一般情况下,若是想使用命名空间内的成员,可以使用作用域限定符 ::(域解析操作符)

#include<iostream>
using namespace std;
namespace A1{
	int mi = 0;
	int qi = 5;
	namespace A2 {
		int qi = 10;
		namespace A3 {
			int mi = 25;
		}
	}
}
int main()
{
	cout << "A1::mi = " << A1::mi << endl;
	cout << "A1::qi = " << A1::qi << endl;
	cout << "A1::A2::qi = " << A1::A2::qi << endl;
	cout << "A1::A2::A3::mi = " << A1::A2::A3::mi << endl;
	return 0;
}

该段代码即使用了作用域限定符;

该符号的作用是通知编译器应从作用域限定符左侧的名字所示的作用域中寻找右侧那个名字,即指定访问哪个名字空间的哪个成员。


命名空间展开

除了可以使用作用域限定符进行操作以外还可以将命名空间展开,同时命名空间展开有两种

命名空间全部展开

命名空间部分展开

命名空间全部展开
命名空间全部展开需要使用

cpp using namespace xxx;
进行修饰;

#include<iostream>
using namespace std;
int main()
{
	cout<<"using namespace std"<<endl;
	return 0;
}

如上代码将标准库中的std命名空间展开,即可以在不受作作用域限定符的限制使用std命名空间内的coutendl

但若是将命名空间全部展开则也有一些麻烦;
例如:
c++ namespace,C++,c++,开发语言

该处将两个命名空间都进行了展开,导致程序在运行中从全局范围中找到了两个rand从而导致的“悲剧”;

故一般情况下,在项目中不支持以命名空间全部展开的方式使用命名空间内的成员;
命名空间部分展开

除了命名空间全部展开以外还有一种方式即相对的进行命名空间部分展开;

 using XXX :: xxx;

以该方式将命名空间中的部分分支进行展开,即可以在不全部展开以及不使用作用域限定符的情况下使用命名空间内的成员;

#include<iostream>

using std::cout;//进行命名空间部分展开将std命名空间内的cout以及endl进行部分展开
using std::endl;//命名展开后可以在不影响该命名空间以内其他成员的情况下使用cout与endl

int main()
{
	cout << "Hello World" << endl;//打印"Hello World"

	return 0;
}

总结

命名空间可以避免命名冲突问题;
命名空间可以进行嵌套;
命名空间必须在全局范围内定义,不可再局部范围内定义;
在使用命名空间内的成员时共有三种方法(作用域限定符、命名空间全部展开、命名空间部分展开),在一般练习中尽量不要进行全部展开;文章来源地址https://www.toymoban.com/news/detail-758526.html

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

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

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

相关文章

  • C++ 之命名空间namespace【详解】

    命名空间(Namespace)在编程中的作用主要有以下几点意义 避免命名冲突:命名空间提供了一种将标识符(如变量、函数、类等)组织和隔离的方式。不同的命名空间可以拥有相同名称的标识符,避免了不同模块或库之间的命名冲突。 提高可读性和可维护性:通过使用命名空

    2024年02月16日
    浏览(29)
  • 详解C++中的命名空间(namespace)

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】 在C++中,总共有63个,大家还记得在C语言中有多少个吗,没错,在C语言中总共有32个。 下面是C++的: asm do if auto return try contin

    2023年04月19日
    浏览(29)
  • 【C++】命名空间 namespace 与 标准流 iostream ( 命名空间概念简介 | 命名空间定义 | 命名空间使用 | iostream 中的命名空间分析 )

    命名空间 namespace 又称为 名字空间 , 名称空间 , 名域 , 作用域 , 是 C++ 语言 对 C 语言 的扩展 之一 ; C++ 中的 命名空间 namespace 指的是 标识符 的 可见范围 , C++ 标准库中的 所有 标识符 , 都定义在 std 命名空间中 ; 命名空间 英文名称是 \\\" namespace \\\" , name 是 名字 , 名称 的意思 ,

    2024年02月12日
    浏览(32)
  • 【C++技能树】NameSpace --命名空间的使用

      Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接       我会一直往里填充内容哒! 🌈LeetCode专栏:专栏链接       目前在刷初级算法的LeetBook 。若每日一题当中有力所能

    2023年04月16日
    浏览(30)
  • Kubernetes集群命名空间(Namespace)

    Namespace是对一组资源和对象的抽象集合. 常见的 pod, service, deployment 等都是属于某一个namespace的(默认是 default) 不是所有资源都属于namespace,如nodes, persistent volume,namespace 等资源则不属于任何 namespace 使用 kubectl get all --namespace=命名空间名称 可以查看此命名空间下的所有资源

    2024年02月16日
    浏览(25)
  • k8s学习笔记(四):命名空间(namespace)详解

    Kubernetes中的Namespace是一种用于在 集群内部组织和隔离资源 的机制。一个Namespace可以看作是一个 虚拟的集群 ,它将物理集群划分为多个逻辑部分,每个部分都有自己的一组资源(如Pod、Service、ConfigMap等)。 Namespace 适合用于 隔离不同用户创建的资源 用于给集群中的 任何对

    2024年02月12日
    浏览(28)
  • 【C#】【命名空间(namespace)】.NET6.0后支持的顶级语句使用问题

    创建C#项目且使用.Net6.0以上的版本时,默认code会使用顶级语句形式: 1、略去static void Main(String[ ] args)主方法入口; 2、隐式使用(即隐藏且根据代码所需要的类自动调用)其他命名空间(包括): using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Net

    2024年02月08日
    浏览(36)
  • 【C++对于C语言的扩充】C++与C语言的联系,命名空间、C++中的输入输出以及缺省参数

    铁子们好啊!这是阿辉新开的专栏《拿下C++》的第一篇文章,本文主要带大家了解一下C++,带大家从C语言过渡到C++,所以大家首先要有C语言的基础,否则后面的内容你可能会异常懵逼。不会C语言的铁子,这里推荐各位先看阿辉的专栏《爱上C语言》(点击即可跳转,自荐一下

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

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

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

    命名空间时怎么来的?它又是什么,让我们一起来看一下吧 首先了解:在同一个域中不能同时出现重名的变量或函数名等(不同域中可以尽管是全局与局部域) ok 我们来看 在工程项目里,一开始用 C语言 开发时,可能你在你的项目文件中给你的变量(或函数)取了一个好名

    2024年02月02日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包