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日

相关文章

  • 记一次 腾讯会议 的意外崩溃分析

    一:背景 1. 讲故事 前段时间在用 腾讯会议 直播的时候,居然意外崩溃了,还好不是在训练营上课,不然又得重录了,崩完之后发现 腾讯会议 的 bugreport 组件会自动生成一个 minidump,截图如下: 作为一个.NET高级调试的技术博主,非 .NET 的程序也得要研究研究哈???,有了这个好奇心,也有了这个 dump,接下来用 windbg 看一看…

    C++ 2023年4月22日
    00
  • C++ 测试框架 GoogleTest 初学者入门篇 丙

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

    C++ 2023年4月17日
    00
  • 最短路径问题

    平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间,其中的一些点之间有连线。 若有连线,则表示可从一个点到达另一个点,即两点间有通路,同路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。 小提示: 两点的距离:如果点\(A\)坐标为\((x_A,y_A)\),点\(B\)的坐标为\((x_B,y_B)\),\…

    C++ 2023年4月24日
    00
  • 信奥赛题1105:数组逆序重存放

    新奥赛一本通,题11051105:数组逆序重存放 时间限制: 1000 ms         内存限制: 65536 KB提交数: 70600                通过数: 47540【题目描述】将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。【输入】两行:第一行数组中元素的个数n(1<n&l…

    C++ 2023年5月5日
    00
  • 第四部分:Spdlog日志库的核心组件分析-logger

    Spdlog是一个快速且可扩展的C++日志库,它支持多线程和异步日志记录。在本文中,我们将分析Spdlog日志库的核心代码,探究其实现原理和代码结构。 Spdlog的基本架构 上一篇文章介绍了spdlog的五个主要组件,其中最重要是Logger、Sink和Formatter其中,Logger负责日志的记录和管理,Sink负责将日志输出到不同的目标(比如控制台…

    C++ 2023年4月18日
    00
  • 【Visual Leak Detector】配置项 StartDisabled

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 StartDisabled 的使用方法。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 配置文件使用说明 2. 设置是否禁用自动初始化 2.1 测试代码 2.2 StartDisabled = no 时的输出 2.3 StartDisabled …

    C++ 2023年4月18日
    00
  • C++动态分配(new)二维数组的若干方法

    写在前面 之前刷动态规划的题目,多需要用到二维数组(也许后面再优化成一维)。如果每次都按照给定数的范围直接声明为全局二维数组变量,又总觉得的不够优雅。查阅了一些网上的资料后,总结了一些使用方法,就写下这篇博文用以记录。 方法1——动态分配(new)一维数组,再强制类型转换为二维(个人使用,推荐指数:⭐⭐⭐⭐) 直接看例子 /** 假设需要根据两个string…

    C++ 2023年4月17日
    00
  • C++ 并发编程实战 第二章 线程管控

    第二章 线程管控 std::thread 简介 构造和析构函数 /// 默认构造 /// 创建一个线程,什么也不做 thread() noexcept; /// 带参构造 /// 创建一个线程,以 A 为参数执行 F 函数 template <class Fn, class… Args> explicit thread(Fn&&amp…

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