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

news2024/12/26 6:39:53

一、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、同名的命名空间会相互合并

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA开发 选择多个文件,系统运行后自动生成ZIP压缩包

选择多个文件&#xff0c;系统运行后自动生成ZIP压缩包 实现方法1.1 代码块1.2 运行结果截取 相关知识 实现方法 案例简述&#xff1a;通过启动java代码来打开文件选择器对话框&#xff0c;用户选择确认需要进行压缩的文件&#xff0c;可一次性选择多个文件&#xff0c;选择完…

whisper 模型源码解读

whisper官方源码 whisper 模型官方代码&#xff1a;https://github.com/openai/whisper/blob/main/whisper/model.py &#xff1b;注释如下 import base64 import gzip from dataclasses import dataclass from typing import Dict, Iterable, Optionalimport numpy as np impo…

ffmpeg解封装rtsp并录制视频-(2)使用VLC模拟一个rtsp服务器并用ffmpeg解封装该rtsp流

VCL模拟服务器并打开播放该视频文件&#xff1a; - 准备好一个mp4文件&#xff0c;打开vlc软件 - 选择“媒体”》“流” - 添加一个mp4文件 - 点击下方按钮选择“串流” - 下一步目标选择rtsp 点击“添加” - 端口默认8554 - 路径设置 /test - 用…

XML Encoding = ‘GBK‘ after STRANS,中文乱码

最近帮同事处理了一个中信银行银企直连接口的一个问题,同事反馈,使用STRANS转换XML后,encoding始终是’utf-16’,就算指定了GBK也不行。尝试了很多办法始终不行,发到银行的数据中,中文始终是乱码。 Debug使用HTML视图看报文时也可以看到中文是乱码。 解决方案: 使用cl…

飞腾银河麒麟V10安装Todesk

下载安装包 下载地址 https://www.todesk.com/linux.html 安装 yum makecache yum install libappindicator-gtk3-devel.aarch64 rpm -ivh 下载的安装包文件后台启动 service todeskd start修改配置 编辑 /opt/todesk/config/config.ini 移除自动更新临时密码 passupda…

STM32CubeMX配置-RTC周期唤醒

一、简介 MCU为STM32G070&#xff0c;采用内部时钟32KHZ&#xff0c;配置为周期6s唤醒&#xff0c;调用回调函数&#xff0c;进行喂狗操作。 二、配置 初始时间、日期、周期唤醒时间配置。 开启周期唤醒中断 三、生成代码 调用回调函数&#xff0c;进行喂狗操作。 //RTC唤醒回…

STM32理论 —— μCOS-Ⅲ(2/2):时间管理、消息队列、信号量、任务内嵌信号量/队列、事件标志、软件定时器、内存管理

文章目录 9. 时间管理9.1 OSTimeDly()9.2 OSTimeDlyHMSM()9.3 OSTimeDlyResume()9.4 延时函数实验 10. 消息队列10.1 创建消息队列函数OSQCreate()10.2 发送消息到消息队列函数(写入队列)OSQPost()10.3 获取消息队列中的消息函数(读出队列)OSQPend()10.4 消息队列操作实验 11. …

绿色版DirectoryOpus功能强大且高度可定制的Windows文件管理器

Directory Opus&#xff08;通常简称为DOpus&#xff09;是一款功能强大且高度可定制的Windows文件管理器。它提供了许多超越Windows默认文件资源管理器&#xff08;Explorer&#xff09;的功能&#xff0c;使得文件和文件夹的管理变得更加高效和直观。以下是对Directory Opus的…

Hex-Rays IDA Pro V7安装教程 (交互式反汇编工具)

前言 DA Pro就像提供了一张二进制的地图&#xff0c;标注了系统函数以及分析人员注解的函数调用&#xff0c;同时展现出各级函数和代码块之间的调用关系。此外&#xff0c;IDA Pro的扩展性能很好&#xff0c;可以利用IDA Pro提供的API接口和IDC脚本来扩展应用&#xff0c;而且…

R语言 | 绘制带P值的差异柱状图

原文链接&#xff1a;R语言 | 绘制带P值的差异柱状图 本期教程 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组下游分析等内容。凡是在社群同学&#xff0c;可免费获得自2021年11月份至今全部教程&…

ElementPlus非表单组件ElUpload值更新后校验不消失问题

项目场景&#xff1a; el-form表单中有一个上传组件&#xff0c;有必填校验。 问题描述 先触发表单的必填校验(点击提交按钮)&#xff0c;然后再上传文件&#xff0c;必填校验的提示一直存在&#xff0c;如果再次点击提交&#xff0c;手动触发表单校验&#xff0c;必填校验消…

2. 机器学习概述

机器学习是对能通过经验自动改进的计算机算法的研究。 ---汤姆. 米切尔 1997 通俗来讲&#xff0c;机器学习就是让计算机从数据中进行自动学习&#xff0c;得到某种知识&#xff08;或规律&#xff09;。在早期的工程领域&#xff0c;机器学习也经常被称为模式识别&#xff08;…

Termius安装docker

安装Termius 直接上官网 新建主机 更新一下yum 更新完成 安装docker的包 设置阿里的yum 直接用命令安装 设置一下开机启动&#xff0c;可以查看docker的版本 拉去portainer的镜像发现报错 出现Get “https://registry-1.docker.io/v2/...“:net/http: TLS hand shake time o…

如何从索尼存储卡恢复数据?

Sony 存储卡广泛用于在数码相机、数码摄像机等中存储照片和视频。如果您从 Sony 存储卡中删除重要数据而未备份&#xff0c;您仍然可以找回丢失的数据。实际上&#xff0c;已删除的视频/照片或文档不会永远丢失&#xff0c;它们仍存储在 Sony 存储卡上&#xff0c;可以通过数据…

功能强大的API函数FindFirstFile使用介绍(附源码)

在处理文件的相关代码中,会频繁使用到Windows系统API函数FindFirstFile,这个函数功能很强大,很多功能都不开它。本文就根据我们在项目中使用该函数的情况,来大概地梳理一下使用FindFirstFile都可以实现哪些常用的功能。 1、FindFirstFile函数声明与WIN32_FIND_DATA结构体 我…

英伟达发布Nemotron-4 340B通用模型:专为生成合成数据设计的突破性AI

引言 2023年6月14日&#xff0c;英伟达发布了Nemotron-4 340B通用模型&#xff0c;专为生成训练大语言模型的合成数据而设计。这一模型可能彻底改变训练大模型时合成数据的生成方式&#xff0c;标志着AI行业的一个重要里程碑。本文将详细介绍Nemotron-4 340B的各个方面&#x…

java高级——Arrays工具类(包含核心的归并和二分排序以及多个底层知识点)

java高级——Arrays工具类 前情提要文章介绍提前了解的知识点1 二分查找思想 Arrays常用方法介绍&#xff08;8大类&#xff09;1. 创建数组1.1 copyOf&#xff08;&#xff09;1.2 copyOfRange&#xff08;&#xff09;1.3 fill&#xff08;&#xff09; 2. 数组转集合&#x…

Win11安装WSA 安卓系统,然后再电脑安装APK文件

参考文章&#xff1a; https://blog.csdn.net/m0_56076343/article/details/122334759 https://blog.csdn.net/u012514495/article/details/120885242 在微软的网站下载 打开&#xff1a;https://store.rg-adguard.net/ &#xff0c;如下图&#xff1a; 在 1 的那个地方&am…

Arthas线上环境问题排查定位工具

一、Arthas简介 Arthas是alibaba推出的一款JVM性能诊断调优的工具&#xff0c;也可以称之为是线上监控诊断产品&#xff0c;通过全局的视角可以实时的查看应用load、内存、GC、线程的状态信息&#xff0c;并且还可以在不修改应用代码的前提下&#xff0c;对业务问题进行诊断&a…

yolo实现大人 小孩 老年人的识别

通过构建人脸检测数据集&#xff0c;实现检测人脸模型的训练 通过构建小孩人脸 大人人脸 老年人人脸的分类数据集&#xff0c;训练分类模型 通过级联人脸检测模型与分类模型&#xff0c;实现图片 视频 摄像头中的人脸检测➕年龄属性判断 python开发语言 pytorch框架 yolo算…