首页 > 编程语言 >C++ namespace介绍

C++ namespace介绍

时间:2024-11-10 12:50:21浏览次数:3  
标签:int namespace 介绍 hh C++ printf using main

我们来看一下这一段代码:

int rand = 0;

int main()
{
	printf("%d", rand);
	return 0;
}

运行结果如下:
在这里插入图片描述
当我们添加一个头文件stdlib.h时,运行结果如下:
在这里插入图片描述
我们可以发现,报错了。这里的问题出现在我们在全局定义了一个变量rand.并且导入了一个头文件stdlib.h
在stdlib.h这个头文件中有一个rand()函数。在运行时,printf(“%d”, rand),这里的rand用的是函数rand().所以报错。这里我们在全局定义的rand变量名字就和我们的rand()函数名字重复了。在C语言中很经常会出现我们定义的变量或者函数和头文件中的变量和函数名字重复。那么在C++中namespace关键字就可以解决这个问题。具体用法是:

namespace haohaoxuexi
{
  //这里的haohaoxuexi可以换成自己想要的名字
}

然后我们在namespace中定义我们需要的变量或者函数:

namespace haohaoxuexi
{
	int rand = 0;
}
int main()
{
	printf("%d", haohaoxuexi::rand);
	return 0;
}

运行结果如下:
在这里插入图片描述
我们发现可以正常运行,原理是namespace关键字生成了一个域。在不同域中可以定义相同的名字,在同一个域中不可以定义相同的名字。我们可以把域理解成地盘
在这里插入图片描述
在上述代码块中有一句代码:

printf("%d", haohaoxuexi::rand);

在这句代码中,小伙伴可以发现有个符号" :: ",这个符号的名字是域作用符,它可以帮助程序找到对应域中的变量或函数等… … 用法是域作用符的左边写上域名,右边写上需要的变量或函数。(namespace只要为了解决名字冲突的问题都可以放进来,不局限于变量和函数,结构体也行)
接下来大家看一下这个代码:

int a = 100;

namespace hh
{
	int a = 50;
}

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

这段代码的运行结果如下:
在这里插入图片描述
我们可以发现分别打印的是25、50、100。我给大家讲解一下为什么结果是这些数。第一个打印语句里面没有域操作符,所以会先在当前的main()函数中找a,找到了a = 25.(若我们没有在main()函数中定义a,则会去全局域中查找,找到了a = 100)打印a :
1、在main()函数中有定义a的结果:
在这里插入图片描述
2、没有在main()函数中定义a的结果:
在这里插入图片描述
在第二个打印语句中,有域作用符并且在域作用符左遍有域名hh,右边有a。所以在这个打印语句中它会去hh域中查找a,找到了a = 50,并打印出来
在第三个打印语句中我们发现在域作用符的左边没有域名。这时候会默认去全局域中查找a,找到了a = 100,并打印
在用namespace关键字可以嵌套使用。如下:

namespace hh
{
	namespace mm
	{
		int a = 0;
	}
}

那该如何使用mm域中的元素呢?
比如说我现在要打印变量a,我们知道变量a在mm域中,我们可以使用域作用符mm::a。域mm在域hh中,我们用域作用符hh::mm::a。最终就可以找到hh域中的mm域中的变量a
代码如下:

namespace hh
{
	namespace mm
	{
		int a = 0;
	}
}

int main()
{
	printf("%d", hh::mm::a);
	return 0;
}

运行结果如下:
在这里插入图片描述
接下来我们再看一段代码:

namespace hh
{
	int a = 20;
}

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

当我们想要多次使用变量a时,我们发现每次使用都需要用上域作用符。在使用时会很麻烦。当我们要多次使用域中的元素时,我们可以用using关键字。

namespace hh
{
	int a = 20;
}

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

运行结果如下:
在这里插入图片描述
using关键字的作用可以理解为把这个域打开一个口子,与外部的全局域相通。这样我们就不需要使用域作用符了。但这里需要注意的是,在对域使用using关键字时,在全局域中不能有同名元素,不然会名字冲突。例子:

namespace hh
{
	int a = 20;
}

int a = 8;
using namespace hh;
int main()
{
	printf("%d\n", a);
	printf("%d\n", a);
	printf("%d\n", a);
	printf("%d\n", a);
	return 0;
}

运行结果如下:
在这里插入图片描述
在使用using关键字的时候也可以单独对域中的某个元素使用比如在hh域中有两个变量a和b。

namespace hh
{
	int a = 20;
	int b = 40;
}

int b = 10;

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

在这个代码块中,我们想要多次使用hh域中的a和单独使用hh域中的b。按原来的写法我们可以用
using namespace hh来把hh域和全局域相同,但这里我们发现在全局域中定义了变量b。若我们用
using namespace hh,会导致变量b的名字冲突。这时候我们可以用using关键字单独把变量a与全局域相通。

using hh::a;

由于hh域中的变量b没法使用using关键字,所以就只能使用域作用符了。代码如下:

namespace hh
{
	int a = 20;
	int b = 40;
}

int b = 10;
using hh::a;

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

结果如下:
在这里插入图片描述
这篇文章到此就结束啦,如果对你有帮助,麻烦给我一个赞和收藏。3Q (─‿‿─)

标签:int,namespace,介绍,hh,C++,printf,using,main
From: https://blog.csdn.net/2401_83665693/article/details/143656797

相关文章

  • 尽管语言都是 C++,由于平台和编译器的不同,API 的实现和使用方式也有所不同,导致出现了很
    确实,尽管语言都是C++,由于平台和编译器的不同,API的实现和使用方式也有所不同,导致出现了很多“变种”。以下是一些常见的原因和应对方法:1.平台差异Windows使用WinAPI,它是Windows系统特有的一组API,许多Windows特定的操作(如窗口管理、文件操作、进程管理)都依赖于Wi......
  • 如何使用gtest编写C++单元测试代码
    目录一.为什么要编写单元测试代码二.gtest是什么三.下载四.使用方法4.1场景一4.2场景二4.3场景三五.其他一.为什么要编写单元测试代码相信很多人都不喜欢编写单元测试代码,但是单元测试对我们来说真的很重要,单元测试可以暴露出我们自己的代码的内部问题,从而保证我......
  • Windows系统安装部署C++基础开发环境
    目录前言安装MinGW-w64安装VSCode安装CMake完成前言这篇文章讨论一下Windows系统怎么安装部署C++基础开发环境,你或许在想这还不简单吗,安装vs不就可以了吗,很对,可以在官网下载vs集成开发环境然后进行安装,这也是非常推荐的一种方案,当然因为比较简单,这篇文章就不讲这个方......
  • C++函数返回多种数据类型
    返回复合数据的结构体定义一个结构体Result,它包含一个整数、一个数组(使用std::vector)和一个矩阵(使用std::vector<std::vector>)。然后实现一个函数来填充这些数据并返回。示例代码:#include<iostream>#include<vector>#include<string>structResult{intn......
  • 【C++】踏上C++的学习之旅(六):深入“类和对象“世界,掌握编程的黄金法则(一)
    文章目录前言1."面向过程"和"面向对象"的碰撞1.1面向过程1.2面向对象2."类"的引入3."类"的定义3.1......
  • 《 C++ 修炼全景指南:十九 》想懂数据库?深入 B 树的世界,揭示高效存储背后的逻辑
    摘要本文深入探讨了B树的原理、操作、性能优化及其实际应用。B树作为一种平衡多路树结构,因其高效的查找、插入和删除操作广泛应用于数据库与文件系统中。文章首先介绍了B树的定义与性质,并详细阐述了节点分裂、合并等核心操作的实现方法。接着,通过分析B树在数据库检......
  • 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS
    因为C++具有跨平台的特性,所以有些需求一套代码就多端使用,比如我最近在学习的OpenGLES。但是,不同平台还是具有一定差异性,所以我们首先得判断出是什么平台?比如iOS系统和Android系统。那么如何判断呢?我们接着往下看!要检查C或C代码中主机的操作系统,我们需要检查编......
  • C++基础学习4练习
    //题目三:交换两个变量的值//定义两个整数变量,要求用户输入它们的值。//交换这两个变量的值,并输出交换后的结果。//#define_CRT_SECURE_NO_WARNINGS1//#include<stdio.h>//intmain()//{// inta=0;// intb=0;// intc=0;// intd=0;//// printf("请输入数......
  • spdlog一个非常好用的C++日志库(十): 十六进制输出spdlog::to_hex
    目录1.引言2.spdlog::to_hex用法3.spdlog::to_hex实现原理4.总结1.引言    在平时调试网络程序时,多数都会用到wireshark抓包工具,在查看某个包的数据都是按照下面这样格式显示的:那么它是怎么做到的呢?其实spdlog的to_hex也能做到这一点,下面就来介绍它的用法和原......
  • C++之模板
    C++模板是一种支持泛型编程的机制,允许开发者定义使用任意类型作为参数的函数和类。模板提供了代码复用和类型安全的抽象,使得同一段代码可以用于不同的数据类型。函数模板定义和使用函数模板是一种可以接受任意类型参数的函数。它通过在函数声明中使用模板参数(用尖括号<>包围......