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

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

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

在这里插入图片描述

c语言内容💖:

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

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


本文深入探究一下为什么在编写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 命名空间,这是一种懒惰的做法

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


在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值