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

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

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

c语言内容:

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

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


目录

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

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

这句代码代表了什么呢?

【C/C++】基础知识之命名空间与作用域_第1张图片
【C/C++】基础知识之命名空间与作用域_第2张图片

一、作用域

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

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

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

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

【C/C++】基础知识之命名空间与作用域_第3张图片
根据【c语言】全局变量的生命周期与作用域 中提到的就近原则,这段代码的输出结果为字符T

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

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

:: 作用域运算符

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

::未指定作用域,默认全局作用域
#include 
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)

【C/C++】基础知识之命名空间与作用域_第4张图片

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


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

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

【C/C++】基础知识之命名空间与作用域_第5张图片

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

二、命名空间

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

通过

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

这种格式来定义命名空间

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

【C/C++】基础知识之命名空间与作用域_第6张图片

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

#include 
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 
using namespace std;
namespace A {
	char c = 'a';
};

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

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

打开命名空间 A后,

#include 
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’

【C/C++】基础知识之命名空间与作用域_第7张图片

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

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

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

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

	cout << A::c << endl;

【C/C++】基础知识之命名空间与作用域_第8张图片

三、为什么需要using namespace std ?

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

【C/C++】基础知识之命名空间与作用域_第9张图片

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

【C/C++】基础知识之命名空间与作用域_第10张图片

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

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

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

【C/C++】基础知识之命名空间与作用域_第11张图片
答案是 当然可以,这两种方法都可以打开某个命名空间

【C/C++】基础知识之命名空间与作用域_第12张图片

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

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

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


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

你可能感兴趣的:(C/C++,c++,c语言,开发语言,学习,笔记)