【C++】命名空间

目录

1 命名空间的引入

2 命名空间的定义

3 标准命名空间std

头文件和std的关系

4 命名空间的使用

4.1 加命名空间名称及作用域限定符::

 4.2 使用using将命名空间中某个成员引入(最推荐)

4.3 使用using namespace +命名空间名称

5 总结


1 命名空间的引入

为了解决C语言中命名冲突问题,C++引入了命名空间:

rand()函数包含在C语言头文件stdlib.h里,为了解决这个问题,可以这样做:

2 命名空间的定义

命名空间里可以放任意的变量、函数、结构体等等

namespace space2
{int a = 10;int add(int x, int y){return x + y;}struct ListNode{struct ListNode* next;int val;};//...
}

命名空间的嵌套 

namespace s3
{int a = 10;namespace s4{int a = 20;}
}

 命名空间s3和s4的变量a虽然同名,但并不会冲突!

命名空间的合并

#include<iostream>
namespace s3
{int a = 10;
}namespace s3
{int b = 20;
}int main()
{std::cout << s3::b << std::endl;return 0;
}

上面的写法相当于:

namespace s3
{int a = 10;int b = 20;
}

 std是C++的标准命名空间,::是作用域限定符,下面会详细介绍。

3 标准命名空间std

标准命名空间std是C++标准库中定义的命名空间,用于包含一系列标准库提供的类、函数和对象。它提供了一种组织和封装代码的机制,以避免命名冲突,并将相关的实体进行逻辑上的分组。在程序中使用std命名空间,可以方便地使用标准库中的函数、对象等。

比如C++的标准输入cin输出cout,STL中的vector、sort、queue、stack等等都在std命名空间里。

头文件和std的关系

先来看一个C++输出hello world的程序:

#include<iostream>
using namespace std;//标准命名空间std展开int main()
{cout << "Hello World" << endl;return 0;
}

其中,iostream文件的包含以及标准命名空间std的展开都是缺一不可的,为什么呢?

头文件和std命名空间的关系是,头文件中的内容被包含在std命名空间中。这意味着,如果一个头文件没有使用任何命名空间,那么其定义的所有符号都位于全局作用域;如果一个头文件使用了命名空间std,那么其定义的所有符号都位于std命名空间中。

在C++标准库中,许多常用的函数、对象和类都被定义在std命名空间中,例如std::coutstd::vector等。因此,在使用这些函数、对象或类时,需要使用std::前缀来标识它们属于std命名空间。

需要注意的是,虽然大部分编译器在实现时并没有严格遵循C++标准,对于原来C语言的头文件,即使按照C++的方式来使用,即#include <cstdio>这种形式,那么符号可以位于命名空间std中,也可以位于全局范围中:

如果我们将C++的cstdio头文件换成C语言的stdio.h头文件:

原因是cstdio里的内容都被包含在std命名空间中,而stdio.h里的内容暴露在全局里!

C++将C语言的头文件形式全部由.h结尾改成了以c开头,可能是为了和自己的一套规范相匹配,比如标准C++之前iostream的写法是iostream.h。

不仅仅是头文件里定义的各种变量、函数等,我们自己定义的一系列东西如果暴露在全局里,就很容易造成命名冲突,因此我们在工作中使用C++语言进行工作时最好不要展开命名空间,那么接下来我们将继续介绍命名空间的使用以及作用域限定符。

4 命名空间的使用

namespace s3
{int a = 10;namespace s4{int a = 20;}int add(int x, int y){return x + y;}
}

我拿嵌套命名空间的例子向大家介绍命名空间的使用:

4.1 加命名空间名称及作用域限定符::

#include<iostream>
namespace s3
{int a = 10;namespace s4{int a = 20;}int add(int x, int y){return x + y;}
}
int main()
{std::cout << "s3中的add(1,2)=" << s3::add(1,2) << std::endl;std::cout << "s3中的a=" << s3::a << std::endl;std::cout << "s4中的a=" << s3::s4::a << std::endl;return 0;
}

s4是包含在s3里的,所以要写成s3::s4

如果我们要进行大量的输入输出,一句一句写std::cout岂不是太麻烦了?

 4.2 使用using将命名空间中某个成员引入(最推荐)

为什么最推荐?

①减少代码量

②防止同名变量命名冲突

#include<iostream>
using std::cout;
using std::endl;
namespace s3
{int a = 10;namespace s4{int a = 20;}
}
using s3::a;
using s3::s4;//err
using s3::add;
int main()
{cout << "s3中的add(1,2)=" << add(1,2) << endl;//3cout << "s3中的a=" << a << endl;//10cout << "s4中的a=" << s3::s4::a << endl;//20return 0;
}

注意,作用域限定符不支持后面跟命名空间:

4.3 使用using namespace +命名空间名称

温馨提醒:平时我们自己写代码可以用,到公司上班了就最好不要写,和别人冲突了就不好了。

using namespace std;//放在头文件前后都可以
#include<iostream>
//using namespace s3;//放在s3前面就err
namespace s3
{int a = 10;namespace s4{int a = 20;}int add(int x, int y){return x + y;}
}
using namespace s3;//ok
int main()
{cout << "hello world" << endl;cout << "s3中的a=" << add(1,2) << endl;cout << "s3中的a=" << a << endl;cout << "s4中的a=" << s4::a << endl;return 0;
}

使用using namespace+命名空间名称,就相当于少写了一层作用域限定符。

需要注意的是,展开自己的命名空间和展开标准命名空间,自己的必须写在命名空间的定义下面std的既可以写在头文件上方也可以写在头文件下方

5 总结

  本文介绍了C++的命名空间,C++的命名空间是为了解决C语言命名冲突的缺陷提出的,对于命名空间的使用,我推荐大家用4.2中的用法,这样有利于培养起优质的代码习惯!

  另外,今天是10/24,祝各位程序员节快乐!

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

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

相关文章

ffmpeg的下载和编译(vs2022)

感谢大佬的二创,直接提供了sln编译 ffmpeg二创地址 创建如下目录 build存放代码(build最好改成source,因为作者这么建议,编译完才发现) msvc存放第三方依赖的头文件,这里固定叫msvc,因为大佬的sln里查找的路径是这个,不嫌麻烦也可以自己改 下载代码和编译器 下载源码…

自动驾驶之—2D到3D升维

前言&#xff1a; 最近在学习自动驾驶方向的东西&#xff0c;简单整理一些学习笔记&#xff0c;学习过程中发现宝藏up 手写AI 3D卷积 3D卷积的作用&#xff1a;对于2DCNN&#xff0c;我们知道可以很好的处理单张图片中的信息&#xff0c;但是其对于视频这种由多帧图像组成的图…

Node.js中的单线程服务器

为了解决多线程服务器在高并发的I/O密集型应用中的不足&#xff0c;同时避免早期简单单线程服务器的性能障碍&#xff0c;Node.js采用了基于"事件循环"的非阻塞式单线程模型&#xff0c;实现了如下两个目标&#xff1a; &#xff08;1&#xff09;保证每个请求都可以…

2023年系统设计面试如何破解?进入 FAANG 面试的实战指南

如果您正在准备编码面试&#xff0c;但想知道如何准备关键的系统设计主题&#xff0c;并寻找正确方法、技巧和问题的分步指导&#xff0c;那么您来对地方了。在本文中&#xff0c;我将分享 2023 年系统设计面试的完整指南。 在软件开发领域&#xff0c;如果您正在申请高级工程…

16、window11+visual studio 2022+cuda+ffmpeg进行拉流和解码(RTX3050)

基本思想:需要一个window11 下的gpu的编码和解码代码,逐开发使用,先上个图 几乎0延迟的,使用笔记本的显卡 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\extras\demo_suite>deviceQuery.exe deviceQuery.exe Starting...CUDA Device Query (Runtime API…

竞赛选题 深度学习图像分类算法研究与实现 - 卷积神经网络图像分类

文章目录 0 前言1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

Java工具库——Commons IO的50个常用方法

工具库介绍 Commons IO&#xff08;Apache Commons IO&#xff09;是一个广泛用于 Java 开发的开源工具库&#xff0c;由Apache软件基金会维护和支持。这个库旨在简化文件和流操作&#xff0c;提供了各种实用工具类和方法&#xff0c;以便更轻松地进行输入输出操作。以下是 Com…

openpnp - SlotSchultzFeeder source code bugfix

文章目录 openpnp - SlotSchultzFeeder source code bugfix概述笔记openpnp源码调试环境排查思路开git分支查到的问题 - 1查到的问题 - 2查到的问题 - 3针对以上问题进行的逻辑修正D:\my_openpnp\openpnp_github\src\main\java\org\openpnp\machine\reference\driver\wizards\G…

Linux下自动挂载U盘或者USB移动硬盘

最近在折腾用树莓派&#xff08;实际上是平替香橙派orangepi zero3&#xff09;搭建共享文件服务器&#xff0c;有一个问题很重要&#xff0c;如何在系统启动时自动挂载USB移动硬盘。 1 使用/etc/fstab 最开始尝试了用/etc/fstab文件下增加:"/dev/sda1 /home/orangepi/s…

从入门到精通:深入了解CSS中的Grid网格布局技巧和应用!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…

论文阅读——GPT3

来自论文&#xff1a;Language Models are Few-Shot Learners Arxiv&#xff1a;https://arxiv.org/abs/2005.14165v2 记录下一些概念等。&#xff0c;没有太多细节。 预训练LM尽管任务无关&#xff0c;但是要达到好的效果仍然需要在特定数据集或任务上微调。因此需要消除这个…

Pytorch代码入门学习之分类任务(一):搭建网络框架

目录 一、网络框架介绍 二、导包 三、定义卷积神经网络 3.1 代码展示 3.2 定义网络的目的 3.3 Pytorch搭建网络 四、测试网络效果 一、网络框架介绍 网络理解&#xff1a; 将32*32大小的灰度图片&#xff08;下述的代码中输入为32*32大小的RGB彩色图片&#xff09;&…

【QT开发(17)】2023-QT 5.14.2实现Android开发

1、简介 搭建Qt For Android开发环境需要安装的软件有&#xff1a; JAVA SDK &#xff08;jdk 有apt install 安装&#xff09; Android SDK Android NDKQT官网的介绍&#xff1a; Different Qt versions depend on different NDK versions, as listed below: Qt versionNDK…

十五、城市建成区时空扩张分析——风向玫瑰图制作

一、前言 风向玫瑰图(简称风玫瑰图)也叫风向频率玫瑰图,它是根据某一地区多年平均统计的各个风向的百分数值,并按一定比例绘制,一般多用8个或16个罗盘方位表示,由于形状酷似玫瑰花朵而得名。 玫瑰图上所表示风的吹向,是指从外部吹向地区中心的方向,各方向上按统计数值…

13. 机器学习 - 数据集的处理

文章目录 Training data splitNormalizationStandardizedONE-HOT补充&#xff1a;SOFTMAX 和 CROSS-ENTROPY Hi&#xff0c; 你好。我是茶桁。 上一节课&#xff0c;咱们讲解了『拟合』&#xff0c;了解了什么是过拟合&#xff0c;什么是欠拟合。也说过&#xff0c;如果大家以…

SK海力士:将成为引领人工智能时代的定制型半导体存储器公司

AI芯片是一种专门针对人工智能应用设计的芯片&#xff0c;能够高效地处理人工智能任务&#xff0c;如机器学习、深度学习等。AI芯片具有高运算速度、低功耗、便于集成等特点&#xff0c;是人工智能领域的重要发展方向之一。 目前&#xff0c;AI芯片主要分为GPU、FPGA和ASIC三种…

Spark On Hive原理和配置

目录 一、Spark On Hive原理 &#xff08;1&#xff09;为什么要让Spark On Hive&#xff1f; 二、MySQL安装配置&#xff08;root用户&#xff09; &#xff08;1&#xff09;安装MySQL &#xff08;2&#xff09;启动MySQL设置开机启动 &#xff08;3&#xff09;修改MySQL…

Spring Boot进阶(94):从入门到精通:Spring Boot和Prometheus监控系统的完美结合

&#x1f4e3;前言 随着云原生技术的发展&#xff0c;监控和度量也成为了不可或缺的一部分。Prometheus 是一款最近比较流行的开源时间序列数据库&#xff0c;同时也是一种监控方案。它具有极其灵活的查询语言、自身的数据采集和存储机制以及易于集成的特点。而 Spring Boot 是…

Android-宝宝相册(第四次作业)

第四次作业-宝宝相册 题目 用Listview建立宝宝相册&#xff0c;相册内容及图片可自行设定&#xff0c;也可在资料文件中获取。给出模拟器仿真界面及代码截图。 &#xff08;参考例4-8&#xff09; 创建工程项目 创建名为baby的项目工程&#xff0c;最后的工程目录结构如下图所…

报错:SSL routines:ssl3_get_record:wrong version number

一、问题描述 前后端联调的时候&#xff0c;连接后端本地服务器&#xff0c;接口一直pending调不通&#xff0c;控制台还报以下错误&#xff1a; 立马随手搜索了一下解决方案&#xff0c;但是emmm&#xff0c;不符合前端的实际情况&#xff1a; 二、解决方法&#xff1a; 实际…