C++基础1: 命名空间

0. 前言

C++是在C语言基础之上的一门语言, 所以学习C++的第一步是思考C++是如何优化C语言设计中的一些不足, 如作用域, IO , 函数, 指针, 宏等

这些内容同时也是为之后学习C++类和对象打基础, 下面说一下C++是如何优化C语言中的作用域

1. 命名空间

在说明命名空间的概念和如何优化C作用域之前, 首先来看一个例子

C++基础1: 命名空间

如图, 编译器报rand重定义错误, 发生这个错误的原因是<stdlib.h>头文件中有一个名为rand的函数

当它包含进t1.cpp源文件后, 它与变量rand发生命名冲突,如下图

C++基础1: 命名空间

这个命名冲突在C语言中是没有办法解决的,因为在C语言中只有局部和全局作用域的概念

而在局部作用域中创建的变量出了作用域后就会被销毁, 所以也不能解决问题

#include <stdio.h>
#include <stdlib.h>
void test()
{
	int rand = 0;
} // 变量rand销毁 
int main()
{
	printf("%d ", rand);
}

 但是命名冲突在C++中可以用命名空间来解决

 

1.1 命名空间的概念

命名空间可以理解为一个域,这个域叫做命名空间域, 命名空间域与其他不同的域分离, 以此解决命名冲突的问题, 如下图

C++基础1: 命名空间

此时变量rand在命名空间域中,  此时它与函数名rand在不同的域中,不同的域可以有相同的名字,所以这样就解决了命名冲突 

下面用实际代码证明

#include <stdio.h>
#include <stdlib.h>

// 命名空间的定义
namespace test
{
	int rand = 0;
}

int main()
{
	printf("%d\n", test::rand); // 命名空间的使用
}

C++基础1: 命名空间

如图所示, 打印出了变量rand的值, 解决了命名冲突 ,接下来详细说一下命名空间的定义与使用

 

1.2 命名空间的定义

1. 命名空间定义的语法:

关键字namespace+命名空间名字+{}

namespace test
{
	int rand = 0;
}

2. 命名空间定义的规则:

  • 命名空间内部可以定义变量, 函数和结构
namespace test1
{
	// 命名空间内可以定义变量, 函数和结构
	int rand = 0;

	int add(int x, int y)
	{
		return x + y;
	}

	struct SLNode
	{
		int data;
		struct SLNode* next;
	};
}
  • 命名空间可以嵌套命名空间
namespace test1
{
	int rand = 0;

	// 命名空间可以嵌套命名空间
	namespace test2
	{
		int a = 1;
		int sub(int x, int y)
		{
			return x - y;
		}
	}
}

 

1.3 命名空间的使用

命名空间有三种使用方式

1. 指定命名空间域:

#include <stdio.h>

namespace test1
{
	int a = 0;
	int c = 2;
	namespace test2
	{
		int b = 1;
	}
}

int main()
{
	// 1. 指定命名空间域 --- 命名空间名字 + 作用域限定符 + 命名空间成员
	printf("%d\n", test1::a);
	printf("%d\n", test1::test2::b);

}

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

#include <stdio.h>

namespace test1
{
	int a = 0;
	int c = 2;
	namespace test2
	{
		int b = 1;
	}
}

// 2. 使用using将命名空间中某个成员引入
using test1::a;
using test1::test2::b;

int main()
{
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

3. 使用using namespace 命名空间名引入

#include <stdio.h>

namespace test1
{
	int a = 0;
	int c = 2;
	namespace test2
	{
		int b = 1;
	}
}

// 3. 使用using namespace 命名空间名引入
using namespace test1;

int main()
{
	printf("%d\n", a);
	return 0;
}

1.4 三种命名空间使用的含义

 上面说明了三种命名空间的使用,下面来具体说一下它们各自的含义还有与包含头文件的区别

C++基础1: 命名空间

using 引入:

C++基础1: 命名空间

using namespace 引入:

C++基础1: 命名空间

包含头文件是将头文件中的函数声明拷贝到源文件中, 所以使用命名空间和包含头文件是两个不同的概念

C++基础1: 命名空间

1.5 关于命名空间的思考

1. 命名空间域默认是关闭的, 只有如上的3种方法使用命名空间域

C++基础1: 命名空间C++基础1: 命名空间

2. 所有的C++头文件和STL都封在一个名为std命名空间域中

 C++基础1: 命名空间C++基础1: 命名空间

如图所示, 只有将命名空间域std引入到全局域中, 才能使用iostream头文件, 这样是为了防止C++标准库与我们自己写的代码之间出现命名冲突

原文链接:https://www.cnblogs.com/xumu11291/p/17329204.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++基础1: 命名空间 - Python技术站

(0)
上一篇 2023年4月19日
下一篇 2023年4月22日

相关文章

  • C++实现一个线程安全的map

    本文是使用ChatCPT生成的,最终的代码使用起来没问题。代码是通过两轮对话完善的,后面把对话合并后跑不出理想效果就没尝试了。 第一轮对话 请求 c++11实现一个线程安全的map,使用方法与std::map保持一致,实现[]运算符 回复 以下是一个简单的线程安全的map实现,可以使用[]运算符来访问和修改map中的元素: //代码省略,后面一起给出 该实现…

    C++ 2023年5月7日
    00
  • Linux/Ubuntu系统下使用VS Code配置C/C++开发环境

        在Ubuntu下,使用VS Code来编辑代码或进行开发非常方便,下面记录一下如何配置gcc/g++编译器和GDB调试工具。 准备工作: 1. 安装VS Code,过程略。 2. 为VS Code安装C/C++ Extension Pack 扩展组件,其他插件会附带安装 3. Ubuntu系统自带g++和gdb,查看一下 配置环境: VS Code …

    C++ 2023年5月7日
    00
  • C++ 测试框架 GoogleTest 初学者入门篇 乙

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/aFeiOGO-N9O7Ab_8KJ2wxw 开发者虽然主要负责工程里的开发任务,但是每个开发完毕的功能都是需要开发者自测通过的,所以经常会听到开发者提起单元测试的话题。那么今天我就带大伙一起来看看大名鼎鼎的谷歌 C++ 测试…

    C++ 2023年4月18日
    00
  • 2023团队天梯模拟赛 L2-3 智能护理中心统计 and L3-1 塔防游戏(23分)

    L2-3 智能护理中心统计 智能护理中心系统将辖下的护理点分属若干个大区,例如华东区、华北区等;每个大区又分若干个省来进行管理;省又分市,等等。我们将所有这些有管理或护理功能的单位称为“管理结点”。现在已知每位老人由唯一的一个管理结点负责,每个管理结点属于唯一的上级管理结点管辖。你需要实现一个功能,来统计任何一个管理结点所负责照看的老人的数量。 注意这是一个…

    C++ 2023年4月19日
    00
  • C语言跳转浏览器打开指定URL

    #include <stdlib.h> int main() { // 定义要打开的URL char* url = “https://rjku.gitee.io/”; // 调用系统命令以默认浏览器打开URL char command[100]; sprintf(command, “open %s”, url); system(command);…

    C++ 2023年4月27日
    00
  • 如何将 Spire.Doc for C++ 集成到 C++ 程序中

    Spire.Doc for C++ 是一个专业的 Word 库,供开发人员在任何类型的 C++ 应用程序中阅读、创建、编辑、比较和转换 Word 文档。 本文演示了如何以两种不同的方式将 Spire.Doc for C++ 集成到您的 C++ 应用程序中。 通过 NuGet 安装 Spire.Doc for C++ 通过手动导入库安装 Spire.Doc f…

    C++ 2023年4月27日
    00
  • 聊一聊 Valgrind 监视非托管内存泄露和崩溃

    一:背景 1. 讲故事 只要是程序总会出现各种莫名其妙的问题,比如:非托管内存泄露,程序崩溃,在 Windows 平台上一般用微软自家的官方工具 App Verifier 就可以洞察,那问题出在 Linux 上怎么办呢?由于 Linux 崇尚自由,需要在各种牛鬼蛇神写的非官方开源软件中寻找一个比较靠谱的,比如本篇所说的 Valgrind。 个人感觉 Valg…

    C++ 2023年5月5日
    00
  • C++/Qt网络通讯模块设计与实现(六)

    前面章节主要讲述网络通讯客户端的实现,各位小伙伴需认真阅读以及理解,理会其中的思想,有疑问的地方可及时给我私信,我都会非常认真地解答大家的疑惑。 C++/Qt网络通讯模块设计与实现(一) C++/Qt网络通讯模块设计与实现(二) C++/Qt网络通讯模块设计与实现(三) C++/Qt网络通讯模块设计与实现(四) C++/Qt网络通讯模块设计与实现(五) 这节…

    C++ 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部