【C/C++】基础知识之命名空间与作用域

news2024/11/20 14:15:08

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、作用域
    • :: 作用域运算符
  • 二、命名空间
    • 使用命名空间
  • 三、为什么需要using namespace std ?

本文深入探究一下为什么在编写C++程序时,需要在头文件下面添加using namespace std;

这句代码代表了什么呢?

在这里插入图片描述
在这里插入图片描述

一、作用域

在之前的c语言中提到过全局变量 【c语言】全局变量的生命周期与作用域

全局变量的生命周期长,从程序启动到程序关闭

在主函数外定义为全局变量,存放在全局/静态区,未初始化默认是0

我们也可以在C++中定义一个全局变量:

在这里插入图片描述
根据【c语言】全局变量的生命周期与作用域 中提到的就近原则,这段代码的输出结果为字符T

如果此时在主函数中有这样一个需求:既要输出局部变量’ T ‘,又要输出全局变量’ i ',应该如何实现呢?

可以使用::作用域运算符来控制输出

:: 作用域运算符

某个作用域 :: 成员变量 使用该作用域内的成员变量

::未指定作用域,默认全局作用域
#include <iostream>
using namespace std;
char c = 'i';
int main()
{
	char c = 'T';
	cout << c << endl;
	// :: 作用域运算符   某个作用域 :: 成员变量  使用该作用域内的成员变量
	// ::未指定作用域,默认全局作用域
	cout << ::c << endl;
	return 0;
}

使用::来指定一个作用域,std就是一个作用域,即全局作用域,直接使用:c就能输出全区变量中的字符c(i)

而未添加::直接输出的就是局部变量中的字符c(T)

在这里插入图片描述

常用的作用域有命名空间结构体


对于全局和局部作用域可以定义相同的成员

但如果是同一个作用域中存在相同的成员,则会报重定义的错误

在这里插入图片描述

此时可以使用命名空间去区分

二、命名空间

命名空间可以用来区分同一作用域下的相同成员

通过

namespace 命名空间名 {
	变量..
	函数..
	结构体...
};

这种格式来定义命名空间

其中,namespace是C++中的关键字,用来定义命名空间。

在这里插入图片描述

例如:定义A B两个命名空间,并定义成员 字符c:

#include <iostream>
using namespace std;

namespace A {
	char c = 'a';
};

namespace B {
	char c = 'n';
};

使用命名空间

使用命名空间有两种方法

1.打开命名空间 using namespace…

这种方法就是我们使用的的using namespace std;

同理,打开命名空间A就是using namespce A;打开命名空间B就是using namespace std;

#include <iostream>
using namespace std;
namespace A {
	char c = 'a';
};

namespace B {
	char c = 'n';
};

using namespace A; //打开命名空间 A

打开命名空间 A后,

#include <iostream>
using namespace std;

namespace A {
	char c = 'a';
};
namespace B {
	char c = 'n';
};

using namespace A;

int main()
{
	char c = 'T';
	cout << c << endl;
	// :: 作用域运算符   某个作用域 :: 成员变量  使用该作用域内的成员变量
	// ::未指定作用域,默认全局作用域
	cout << ::c << endl;
	return 0;
}

这里的::c输出结果就为命名空间A中的字符’a’

在这里插入图片描述

使用命名空间的另一种方法:

2.使用作用域 某作用域::成员

前面提到了作用域操作符::可以通过这种方法来控制输出A或B作用域中的成员输出

例如:使用A命名空间中的字符c输出,结果也是命名空间A中的字符’a’

	cout << A::c << endl;

在这里插入图片描述

三、为什么需要using namespace std ?

其实,观察我们常用的cincout输入输出函数还有endl换行,他们就是使用了std这个标准命名空间:

在这里插入图片描述

因此,如果没有添加using namespace std;这句话,即没有打开标准命名空间,直接使用cin 和cout endl就会进行报错

在这里插入图片描述

在我们了解了使用命名空间的方法后,也就理解了为什么在编写C++程序时,需要在头文件下面添加using namespace std;

就是因为输入输出cin cout依赖std标准命名空间

我们学习了两种打开命名空间的方法,另一种使用作用域操作符::是否可行呢?

在这里插入图片描述
答案是 当然可以,这两种方法都可以打开某个命名空间

在这里插入图片描述

这种方式简单直接,但是每次使用的时候都需要指明命名空间

注:using namespace 命名空间,这是一种懒惰的做法

打开一次里面的成员将全部对外开放。打开了多个命名空间如果成员名相同会出现二义性


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

【学习日记2023.6.2】之 管理端报表统计

文章目录 11. 管理端报表统计11.1 Apache ECharts11.1.1 介绍11.1.2 入门案例 11.2 营业额统计11.2.1 需求分析和设计11.2.2 代码开发Controller层Service层接口Service层实现类Mapper层 11.2.3 功能测试11.2.4 提交代码 11.3 用户统计11.3.1 需求分析和设计11.3.2 代码开发Con…

【QCA6174】QCA6174认证DFS跳转信道距离干扰信道太近,导致边带可以检测到信号问题分析及解决方案

WIFI DFS测试要求 Master设备需要测试的项目 4.6.2.1 Channel Availability Check ---信道可用性检查 定义其作为雷达脉冲检测机制,当雷达脉冲出现时所占用的信道需要能被设备检测到已经被占用。当相关信道未被占用时,这些信道被称为Avaliable Channel可用信道 4.6.2.2 In…

23Java面试专题 八股文面试全套真题(含大厂高频面试真题)多线程

文档说明 在文档中对所有的面试题都进行了 难易程度和 出现频率的等级说明 星数越多代表权重越大&#xff0c;最多五颗星&#xff08;☆☆☆☆☆&#xff09; 最少一颗星&#xff08;☆&#xff09; Java多线程相关面试题 1.线程的基础知识 1.1 线程和进程的区别&#xff1f; 难…

敷尔佳三闯IPO:去年狂赚8亿,广告宣传费近4亿

618大促已经开启&#xff0c;敷尔佳能否借“618”撑起“医美面膜第一股”&#xff1f; 近日&#xff0c;哈尔滨敷尔佳科技发展有限公司&#xff08;下称“敷尔佳”&#xff09;更新招股书&#xff0c;继续冲刺“医美面膜第一股”。 敷尔佳是一家主要从事专业皮肤护理产品的研…

MySQL中的业务数据该如何正确导入到Hive中 - Sqoop

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 1. 使用Sqoop脚本将MySQL中的数据迁移到HDFS 2. 在Hive中建立与之对应的表 3. 将HDFS中的数据load到 Hive 数仓的ODS层的表中 1 . 使用Sqoop 将 MySQL中的数据导入到HDFS上 #! /bin/bashsqoo…

二进制安装Kubernetes(K8s)集群(基于containerd)---从零安装教程(带证书)

一、实验环境 1、安装说明 selinux iptables off 官方网站&#xff1a;https://kubernetes.io/zh-cn/docs/home 主机名IP系统版本安装服务master0110.10.10.21rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxymaster0210.10.10.22rhel7.5nginx、…

Ubuntu安装ssh并开启服务

Ubuntu开启SSH服务 1、更新源列表 $ sudo apt-get update 2、安装 说明:安装时需要提供互联网或者提前下载安装包 $ sudo apt-get install openssh-server 3、启动 $ sudo service ssh start 查询服务启动状态: $ sudo ps -e | grep ssh 或者 $ sudo service ssh status …

【C++】模板(1)

文章目录 前言一、泛型编程二、模板2.1 函数模板2.2 函数模板实例化&#xff1a;2. 3 函数模板的原理&#xff1a;2.4 模板参数的匹配原则 三、类模板 前言 C中的模板(template)是一种强大的语言特性&#xff0c;它可以让程序员编写可以适用于不同数据类型的通用代码。通过使用…

Js中的堆(heap)和栈(stack)内存

目录 1、堆和栈的概念2、数据类型3、腾讯面试题4、阿里面试题 1、堆和栈的概念 在JS钟变量都存放在内存中&#xff0c;而内存给变量开辟了两块区域&#xff0c;分别为栈区域和堆区域栈(stack)&#xff1a;是栈内存的简称&#xff0c;栈是自动分配相对固定大小的内存空间&#…

长尾词挖掘,挖掘有效长尾关键词的3个方法

长尾关键词的特征是比较长&#xff0c;往往是2-3个词组成&#xff0c;甚至是短语&#xff0c;存在于内容页面&#xff0c;除了内容页的标题&#xff0c;还存在于内容中。 长尾关键词带来的客户&#xff0c;转化为网站产品客户的概率比目标关键词高很多&#xff0c;因此长尾…

Nginx服务

目录 一、Nginx概述 二、编译安装Nginx服务 1.安装Nginx服务 2. Nginx服务的基础命令 2.1开启nginx服务 2.2关闭nginx服务 2.3重载配置文件 2.4平滑升级 3.添加 Nginx 系统服务 3.1判断 Nginx 服务是否开启 3.2 方法一&#xff1a;将 nginx 服务添加到 chkconfig管…

《面试1v1》CMS垃圾回收期

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 《面试1v1》 连载中… 面试官&#xff1a; 小伙子,CMS 垃圾收集器跟我讲讲? 候选人&#xff1a; CMS全称Concurrent Mark Sweep,是一种并发标记清除算法。它并发执…

Unity3d 有关Invoke和 Coroutine 的执行条件的误解

文章目录 认识错误的点正解测试代码执行截图 认识错误的点 之前一直以为在父物体未激活的状态下&#xff0c; invoke 和 Coroutine 都不会执行。这里面有一点误区。 正解 Coroutine 在父物体未激活状态下&#xff0c;确实不会执行。并且如果在父物体&#xff08;包括祖先节点…

新手小白运行Springboot+vue项目

有时候我们会经常复刻别人的项目代码&#xff0c;在第一次运行别人的代码都需要哪些步骤呢&#xff1f; 我在第一次运行的时候踩了很多坑&#xff0c;也看了很多博文&#xff0c;这篇文章将我认为帮助较大的内容进行了一个整合&#xff0c;希望可以为不了解前后端分离&#xff…

【踩坑日记】【YOLO5】YOLO5 训练模型的测试结果全部相反(标签混乱)原因

问题描述 使用 labelImg 为图片数据集打上标签后交给YOLO5训练&#xff0c;发现测试结果中识别结果全部相反&#xff0c;也就是出现了标签混乱的现象。本人使用猫狗图片各 150 张作为数据集进行模型训练&#xff0c;训练出来的模型将所有的猫识别成了狗&#xff0c;所有的狗识…

【数据库从0到1】-【入门基础篇】

【数据库从0到1】-【入门基础篇】 &#x1f53b;一、数据库产生背景&#x1f53b;二、数据库有关概述&#x1f53b;三、数据库访问接口&#x1f53b;四、数据库种类&#x1f53b;五、数据库有关术语&#x1f53b;六、常见DBMS排名&#x1f53b;七、常见数据库介绍7.1 RDS(关系型…

DVWA——Brute Force

文章目录 Brute Force&#xff08;暴力&#xff08;破解&#xff09;&#xff09;&#xff08;1&#xff09;Low等级&#xff08;2&#xff09;Medium等级&#xff08;3&#xff09;High等级&#xff08;4&#xff09;Impossible Brute Force&#xff08;暴力&#xff08;破解&…

基于SpringBoot的三层架构开发统一响应结果

说明&#xff1a;三层架构开发时目前开发的主流&#xff0c;我这里通过一个案例&#xff0c;来分析非三层架构开发的不利之处&#xff0c;以及三层架构开发的好处。 案例说明&#xff1a;打开员工信息页&#xff0c;页面要显示所有员工的信息&#xff1b;前端页面已提供&#…

cs109-energy+哈佛大学能源探索项目 Part-3(探索性分析)

博主前期相关的博客见下&#xff1a; cs109-energy哈佛大学能源探索项目 Part-1&#xff08;项目背景&#xff09; cs109-energy哈佛大学能源探索项目 Part-2.1&#xff08;Data Wrangling&#xff09; cs109-energy哈佛大学能源探索项目 Part-2.2&#xff08;Data Wrangling&a…

Java设计模式(三)

系列文章目录 迪米特法则 合成复用原则 设计原则核心思想 文章目录 系列文章目录前言一、迪米特法则1.迪米特法则基本介绍2.迪米特法则注意事项和细节 二、合成复用原则1.合成复用原则基本介绍 三、设计原则核心思想总结 前言 大家好呀&#xff0c;欢迎来到柚子的博客~让我们…