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日

相关文章

  • Qt源码阅读(四) 事件循环

    事件系统 文章为本人理解,如有理解不到位之处,烦请各位指正。 @ 目录 事件系统 什么是事件循环? 事件是如何产生的? sendEvent postEvent 事件是如何处理的? 事件循环是怎么遍历的? 事件过滤器 event 夹带私货时间 Qt的事件循环,应该是所有Qter都避不开的一个点,所以,这篇博客,咱们来了解源码中一些关于Qt中事件循环的部分。先抛…

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

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

    C++ 2023年4月18日
    00
  • 网络框架重构之路plain2.0(c++23 without module) 环境

    接下来本来就直接打算分享框架重构的具体环节,但重构的代码其实并没有完成太多,许多的实现细节在我心中还没有形成一个定型。由于最近回归岗位后,新的开发环境需要自己搭建,搭建的时间来说花了我整整一天的时间才勉强搞定。人们常说工欲善其事必先利其器,开发环境和工具是必不可少的,否则你会发现在接下来的过程中遇到困难的时候就会走很多弯路。虽然最后我们仍旧达到了目的,但是我…

    C++ 2023年4月17日
    00
  • 【Visual Leak Detector】源码下载

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 源码的下载。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 下载途径 2. 不同下载途径的源文件差异 1. 下载途径 以 v2.5.1 版本为例,可以到 Github-KindDragon-vld 页面下载 master 的 zip 源码包,如下所示: 也可以到 …

    C++ 2023年4月22日
    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
  • 面试最常问的数组转树,树转数组 c++ web框架paozhu实现

    刚毕业同学,找工作常被问 二维数组转树,树转二维数组 需要支持无限层级实现,如果你了解这个语言那么实现起来还要一番思考 c++ web框架 paozhu使用 需要实现数据库表数据到前台菜单实现,就是这种功能 二维数组转树,树转二维数组 保存时候树二维数组,展示时候树树状。 这个技术难点在于无限递归,这个树程序基本原理 现在看看c++怎么实现的,无限递归,家肯…

    C++ 2023年4月25日
    00
  • L1-080 乘法口诀数列*(使用C++)

    L1-080 乘法口诀数列 分数 20 全屏浏览题目 切换布局 作者 陈越单位 浙江大学   本题要求你从任意给定的两个 1 位数字 a1​ 和 a2​ 开始,用乘法口诀生成一个数列 {an​},规则为从 a1​ 开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。 输入格式: 输入在一行…

    C++ 2023年4月18日
    00
  • C++ 学习笔记

    堆,栈,RAII 堆:分配内存之后需要手动释放,否则,将要造成内存泄漏 new和delete操作的是free store malloc和free操作的是heap new的底层就是malloc 动态获取内存都是在堆中进行的auto ptr = new std::vector<int>() 智能指针 unique_ptr 独享它所指向的指针,也就是说…

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