【C++入门(1)】命名空间

一、C++出世

我们先简单认识下C++的来历,C++是在C语言的基础上发展来的。

当年C++的设计者Bjarne Stroustrup,本贾尼·斯特劳斯特卢普先生设计C语言之初,是为了对C语言做出一些更改,弥补C语言在一些方面的不足,或者做出其他的设计,来让C语言更加适合程序员的使用。

简而言之,Bjarne Stroustrup当时只是考虑做些小的补充,然而后来,随着补充工作的逐渐增多,以及一些大的改动,他的“补充版C语言”最终演变成了一门新的语言,也就是C++.

二、命名空间的由来

我们现在知道,C++一开始是为了弥补C语言的一些不足和不方便之处。这篇文章介绍的命名空间,就是这一目的的产物。我们看下面这段C语言代码:

#include <stdio.h>

int rand = 0;

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

它目前看起来没有任何问题。但如果我们在开头再引用上一个头文件<stdlib.h>,会怎么样呢?

我们很遗憾的看到,程序报了一个错误 ,告诉我们rand重定义了。这个报错的原因在于rand是stdlib.h中的一个库函数,程序编译时头文件展开,里面早已包含了一个对rand的定义。如果想要解决这个问题,我们通常能采取的办法就是修改自己的变量名,毕竟我们很难说能去修改库中的定义。

由此我们可以看出,在C语言中,我们取变量名时是受到一定的限制的,不能和库中的变量名相同。然而库函数成百上千,我们怎么能时时刻刻保证自己会避免踩坑呢?所以C++中就产生了命名空间这一概念。

我们创建一个命名空间域,把自己创建的rand变量放入这个命名空间域中,就可以避免上面的报错了:

namespace是C++中一个关键字,用于创建命名空间,后面自己指定的变量名me通常被称作域名::域作用限定符,通过域作用限定符,我们就可以找到命名空间中的变量并加以引用。

命名空间域中不仅可以创建变量名,也可以创建函数名,结构体共用体等等。

三、命名空间域的展开

1、展开某个命名空间域

从上面的例子可以看到,每一次使用命名空间域中的变量,都需要使用域作用限定符来指定一下在哪个命名空间中查找这个变量。如果对一个命名空间域中的变量使用次数很多时,这样的引用未免显得太过复杂,有没有什么办法可以不用再每次使用域作用限定符来指定,而是让编译器自动就去这个命名空间域中去找呢?答案是可以的:

#include <stdio.h>

namespace me
{
	int a = 3;
}

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

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

通过展开命名空间,我们就可以省去域作用限定符,直接引用一个命名空间域中的变量。

2、展开命名空间域中某个变量

我们不仅可以展开一整个命名空间域,还可以精准的只展开某一命名空间域中的一个变量:

#include <stdio.h>

namespace me
{
	int a = 3;
	int b = 2;
}

using me::b;

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

四、变量的查找顺序

我们再看下面这个例子:

可以看到,单独使用rand变量时,编译器会首先使用局部域中的变量,其次在全局域中找,最后才会在命名空间域中找。::前没有指定命名空间域时,默认使用的是全局域。我们可以总结出以下规律:

当编译器引用变量时,引用顺序为局部域>全局域=展开的命名空间域>命名空间域(需声明)。

五、命名空间的一些规则

1、命名空间允许嵌套

命名空间是可以嵌套使用的:

#include <stdio.h>

namespace aaa
{
	namespace mmm
	{
		int n = 0;
	}
}

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

命名空间可以像这样一层套一层的连续使用,引用的时候依次使用域作用限定符链接即可。

2、同名的命名空间会相互合并

命名空间是可以重名的,重名的命名空间会在编译时相互合并,视为一个命名空间。

同一文件中的重名命名空间会合并,不同文件中的重名命名空间也会合并。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/706025.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二阶段提交(2pc)协议

二阶段提交&#xff08;2pc&#xff09;协议 1、 简介 二阶段提交算法是一个分布式一致性算法&#xff0c;强一致、中心化的原子提交协议&#xff0c;主要用来解决分布式事务问题。在单体spring应用中我们往往通过一个Transactional注解就可以保证方法的事务性&#xff0c;但…

破解发展难题 台山这家合作社以农业社会化服务助推乡村振兴

风吹稻田千层浪&#xff0c;眼下&#xff0c;台山四九镇的早稻长势喜人&#xff0c;沉甸甸的稻穗迎风而动&#xff0c;已进入破口抽穗的关键期&#xff0c;即将在6月底陆续迎来丰收。在台山市明华汇种养专业合作社管理的稻田里&#xff0c;合作社负责人梁明喜正仔细观察着稻苗的…

算法第六天:力扣第977题有序数组的平方

一、977.有序数组的平方的链接与题目描述 977. 有序数组的平方的链接如下所示&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/description/https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组…

#慧眼识模每日PK[话题]##用五种语言说爸爸我爱你[话题]#

#慧眼识模每日PK #用五种语言说爸爸我爱你 你觉得哪个模型回答得更好&#xff1f;欢迎留言 A.蓝 B.紫 更多问题&#xff0c;扫码体验吧&#xff5e; by 国家&#xff08;杭州&#xff09;新型交换中心

Whisper语音识别 -- 自回归解码分析

前言 Whisper 是由 OpenAI 开发的一种先进语音识别系统。它采用深度学习技术&#xff0c;能够高效、准确地将语音转换为文本。Whisper 支持多种语言和口音&#xff0c;并且在处理背景噪音和语音变异方面表现出色。其广泛应用于语音助手、翻译服务、字幕生成等领域&#xff0c;为…

鸿蒙轻内核A核源码分析系列七 进程管理 (3)

本文记录下进程相关的初始化函数&#xff0c;如OsSystemProcessCreate、OsProcessInit、OsProcessCreateInit、OsUserInitProcess、OsDeInitPCB、OsUserInitProcessStart等。 1、LiteOS-A内核进程创建初始化通用函数 先看看一些内部函数&#xff0c;不管是初始化用户态进程还…

收银系统小程序商城商品详情页再升级!

本期导读 1.新增&#xff1a;商品详情页新增商品参数模块&#xff1b; 2.新增&#xff1a;商品详情页新增保障服务模块&#xff1b; 3.新增&#xff1a;线上商城商品新增划线价&#xff1b; 4.新增&#xff1a;线上商城分销商品新增“赚”字标签及预收收益&#xff1b; 5.…

Linux-笔记 全志平台OTG虚拟 串口、网口、U盘笔记

前言&#xff1a; 此文章方法适用于全志通用平台&#xff0c;并且三种虚拟功能同一时间只能使用一个&#xff0c;原因是此3种功能都是内核USB Gadget precomposed configurations的其中一个选项&#xff0c;只能单选&#xff0c;不能多选&#xff0c;而且不能通过修改配置文件去…

我的考研经历

当我写下这篇文章时&#xff0c;我已经从考研 的失败中走出来了&#xff0c;考研的整个过程都写在博客日志里面了&#xff0c;在整理并阅读考研的日志时&#xff0c;想写下一篇总结&#xff0c;也算是为了更好的吸取教训。 前期日志模板&#xff1a;时间安排的还算紧凑&#x…

安鸾学院靶场——安全基础

文章目录 1、Burp抓包2、指纹识别3、压缩包解密4、Nginx整数溢出漏洞5、PHP代码基础6、linux基础命令7、Mysql数据库基础8、目录扫描9、端口扫描10、docker容器基础11、文件类型 1、Burp抓包 抓取http://47.100.220.113:8007/的返回包&#xff0c;可以拿到包含flag的txt文件。…

DDei在线设计器-配置主题风格

DDeiCore-主题 DDei-Core插件提供了默认主题和黑色主题。 如需了解详细的API教程以及参数说明&#xff0c;请参考DDei文档 默认主题 黑色主题 使用指南 引入 import { DDeiCoreThemeBlack } from "ddei-editor";使用并修改设置 extensions: [......//通过配置&am…

【FreeRTOS】内存管理

目录 1 为什么要自己实现内存管理2 FreeRTOS的5中内存管理方法2.1 Heap_12.2 Heap_22.3 Heap_32.4 Heap_4 2.5 Heap_53 Heap相关的函数3.1 pvPortMalloc/vPortFree3.2 xPortGetFreeHeapSize 3.3 xPortGetMinimumEverFreeHeapSize3.4 malloc失败的钩子函数 参考《FreeRTOS入门与…

Python私教张大鹏 Vue3整合AntDesignVue之DatePicker 日期选择框

案例&#xff1a;选择日期 <script setup> import {ref} from "vue";const date ref(null) </script> <template><div class"p-8 bg-indigo-50 text-center"><a-date-picker v-model:value"date"/><a-divide…

原子阿波罗STM32F429程序的控制器改为STM32F407驱动LCD屏

原子大神的阿波罗开发板使用STM32F429IGT6控制器&#xff0c;编程风格也与探索者F407系列有了很大的不同&#xff0c;使用BSP功能模块编程了&#xff0c;也有点类似于安富莱的编程风格了。这种模块式程序风格的优点是更加方便移植&#xff0c;更方便泡系统。 但无奈手里只有F40…

模拟笔试 - 卡码网周赛第二十一期(23年美团笔试真题)

第一题&#xff1a;小美的排列询问 解题思路: 简单题&#xff0c;一次遍历数组&#xff0c;判断 是否有和x、y相等并且相连 即可。 可优化逻辑&#xff1a;因为x和y是后输入的&#xff0c;必须存储整个数组&#xff0c;但是上面说了 **排列是指一个长度为n的数组&#xff0…

搭建一个好玩的 RSS 订阅网站记录

全文相关链接 Github仓库创建链接Railway官网Supabase官网f-droid上的co.appreactor.news应用下载链接Railway账户使用量估算链接 全文相关代码 原文地址: https://blog.taoshuge.eu.org/p/270/ Dockerfile FROM docker.io/miniflux/miniflux:2.1.3环境变量 DATABASE_URL…

UniApp或微信小程序中scroll-view组件使用show-scrollbar在真机Android或IOS中隐藏不了滚动条的解决办法

show-scrollbar 属性 不论是使用 变量 还是直接使用 布尔值或者直接使用 css 都是在 ios、Android 上是都没有效果。。 真机中还是出现滚动条 解决办法 添加下面CSS ::-webkit-scrollbar {display: none;width: 0 !important;height: 0 !important;-webkit-appearance: no…

Charles代理https接口到本地

一、操作手册 1、安装工具 1.1、安装代理软件Charles 软件下载地址&#xff1a;Download a Free Trial of Charles • Charles Web Debugging Proxy 1.2、安装https代理插件&#xff1a;&#xff08;有问题自行百度解决&#xff09; 2、配置策略 以下以https接口为例&…

mysql索引B+树可视化演示地址

https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html