关于iostream与using namespace std 的解析

1 概述

当我们在使用C++语法进行编程练习的时候,往往在代码的前两行会这样来写:

include
using namespace std;

学过C语言的同学在学习C++的时候是否会产生这样的疑惑呢:

练习C语言编程的时候,只需要声明一个头文件:#include.而为什么在C++中,却需要写出include和using namespace std;这两行代码呢?

其中第一行include我们还勉强可以理解,它其实类似于C语言中的#include,即:声明标准的输入输出头文件。然而using namespace std究竟起到了什么作用呢?

针对这个问题,网络上有很多专业的说法,但是长篇大论的内容,对于初学者来说实在头疼,根本看不进去,所以接下来我希望可以用简练的语言来解释清楚using namespace std的作用,以下的内容虽可能有些许冗余,但我相信是通俗易懂的,您只要能够一行行的看下去,一定能够完全看懂!

本人认为正确的学习顺序是:我们要做到先学会定义、使用和理解命名空间(namespace),再回过头去研究using namespace std;的作用,这样可以起到事半功倍的效果,那么接下来重点就来了。

1、定义命名空间

(1)定义简单的命名空间

//1、定义命名空间A
namespace A
{
   int a=0;//在命名空间A中定义变量a
}

定义一个命名空间就是这样简单:在这个命名空间A中,有一个int型的变量,他的名字是“a”。那么我们接下来直接上难度!定义一个复杂的命名空间。

(2)定义复杂的命名空间

要求:定义命名空间B,并在命名空间B中定义命名空间C,并在命名空间C中定义结构体Teacher

//2、复杂的命名空间
namespace B  //定义命名空间B
{
	int a=1;//在命名空间B中也可以定义变量a,因为他们不在同一个命名空间中

	namespace C//还可以在命名空间B中再定义一个命名空间C
	{
		struct Teacher//在命名空间C中定义结构体Teacher
		{
			char a[32];//结构体中还可以定义变量a,因为这三个“a”都不在同一个命名空间中
			int b;
		};
	}
}

2、使用命名空间

(1)使用命名空间的基本方法

前面已经定义好了命名空间A、B、C,且在这三个命名空间中都定义相同的变量“a”,接下来我们就来使用这三个命名空间。

int main()
{
//使用命名空间的基本方法1	
	using namespace A;//告诉编译器我要使用命名空间A中的功能了
	a=10;             //将命名空间A中的变量“a”由0更改为10
    	cout<

注意:此时只使用了命名空间A,所以只会对命名空间A中的变量a进行访问,而不会对命名空间B、C中的变量a进行访问。而实际上,针对上面这三行代码,只要第三行代码中变量“a”的指向明确,便可以省去第一行“using namespace A”,如下:

//使用命名空间的基本方法2
//由于在代码中只要使用这两种方法中的其中一种即可,所以我在第二种方法这里加上的“//”注释符号,如下两行代码:
// a=10;
// cout<

以上两种使用命名空间的方法供君随意挑选^_^

(2)使用复杂的命名空间

命名空间A的使用相对简单,但是在命名空间B中嵌套着命名空间C,并且命名空间C中又嵌套着结构体Teacher,那么我们又该如何去使用命名空间B和命名空间C呢?

接下来,除了使用命名空间A以外,如果我们还使用了命名空间B的话," a=10; " 这条语句的指向就不明确了:因为命名空间B中也有个变量a,于是现在有两个"a"可以被访问。故:若想访问某一个特定的变量a就需要指向明确!

using namespace B;
//如果想访问某一个特定的变量a,就需要指向明确!如下:
	cout<

(3)使用结构体Teacher中的变量

//如何使用Teacher
	//方法1:这种方法每定义一个结构体就需要:“B::C::Teacher 结构体名称”
	//B::C::Teacher t1;//用命名空间B中的命名空间C中的结构体模板(Teacher)来定义结构体t1
	//t1.b=33;//注意:t1.a 语法错误!是因为a是一个指针(地址),这个指针是无法被修改的,否则以后无法释放内存                      

	//方法2:先一口气直接定义好“结构体型”数据类型,然后按照根据数据类型定义变量的方法来使用结构体
	using B::C::Teacher;
	Teacher t2;
	t2.b=22;
	return 0;
}

3、关于iostream与using namespace std 的解析

(1)通过以上关于命名空间的定义及使用的介绍,我们不难发现:不同的命名空间之间是相互独立的个体,虽然附加在其中的变量名可能是相同的(比如上面所提到的命名空间A、B、C中都包含有变量a),但是没关系:“命名空间” 这层 “屏障”将这些相同的变量名分隔开来,让他们虽然拥有相同的名字,但是互不影响。

(2)看起来命名空间的引入十分方便,让我们不必再因为变量重名而烦恼。但是在以前,并没有命名空间这个概念,而是将标准库功能定义在全局空间里,并声明在(早期的C++头文件)中。但是由于标准库非常的庞大,那么程序员在选择的类的名称或函数名时,就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都放在一个名为std的命名空间中。后来C++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h,即出现了现在的头文件。

(3)当使用的时候,该头文件没有定义全局命名空间,必须使用C++所规定的标准的命名空间(即:namespace std),这样才能正确使用cout、endl等功能。

(4)最后:如果大家想进一步了解相关内容,请参考:点击打开链接 谢谢。

你可能感兴趣的:(C,命名空间的定义与使用,头文件,解析,iostream)