c++中的命名空间
C++是一种面向对象的计算机程序设计语言。
C++是C语言的继承,进一步扩充和完善了C语言。它肯定与C语言相比有许多不同,这篇文章就namespace这一个关键字来说一哈。
首先先来一个大家很熟悉的你好世界,
#include<iostream>
using namespace std;
int main(void)
{
cout << "hello world~" << endl;
return 0;
}
大家就会发现,比起C,C++在头文件和main函数中多了一串代码,
using namespace std;
这串代码是什么?
这串代码有什么用?
怎么样使用?
解决这三个问题似乎就是当务之急。下面就我个人理解主要是网课看多了 ,给大家阐述。
Examlpe:
#include<stdio.h>
int main(void)
{
int printf = 0;
return 0;
}
小明是个很倔的人,他写代码就想搞一个名字叫做printf的变量,怎么办?
小明和小王为同一个项目编写代码,都使用了fork这个变量,合并成一个程序执行代码的时候,以谁的fork为准?
C++为解决以上命名冲突问题,新增了一个命名空间,其中使用的关键字就是namespace;
语法如下
namespace name
{
int printf = 0; //可以申明变量,函数等等,
}
调用:用域操作符 ::
//name::变量名等
cout << name::printf << endl;
这表明printf是命名空间name中的变量,并不是打印函数。
其中name就是命名空间的名字,看个人喜好取名,这样就保证了每个人用每个人的变量,函数名等。
来一个巩固:
namespace N {
int printf = 0;
}//命名空间的声明
cout << printf << endl;
cout << N::printf << endl;
VS 上的输出为:一个为printf指针的大小,一个为N命名空间中的变量printf, 当然为0。
那么,一个问题接着而来,小明在项目中要用到自己独有的变量fork,他申明了xiaoming这个命名空间,
namespace xiaoming{
int a = 0;
int fork = 0;
}
but他要在接下来的代码中使用几千次fork,那不是要输入几千次域操作符?so,命名空间的展开随之而来。
using namespace xiaoming;
告诉编译器,xiaoming这个命名空间展开,接下来不加修饰的fork这个变量,就是xiaoming的fork。但是,显而易见的问题,那为什么我不直接把变量写在main中?命名冲突还会出现。 所以,工作时不推荐展开,但平时练习可以使用。
但是,可以只展开常用的。
using xiaoming::fork;
这样就只展开fork这个变量,变量a并不展开。
1,命名空间可以合并。如果在不同地方声明两个相同的namespace,编译器在执行时会将其中的内容合并。
2,命名空间可以嵌套。
namespace N1{
int a = 0;
int b = 1;
namespace N2{
int Sum(int number1,int number2)
{
return number1+number2;
}
}
}
调用Sum函数:N1::N2::Sum(1,2);
现在来解决刚开始的代码,
using namespace std;
std是标准函数库使用的命名空间,写上这一句,就相当于C语言中引入stdio.h头文件,在std中声明了各种函数,如printf。当然,并不一定要写上这一句,也可以这样,
#include<iostream>
int main(void)
{
std::cout <<"hello world~" << std::endl;
return 0;
}
只是为了方便,通常会写上这一句。同样的,多人工程中不推荐。
本人也是最近开始学习C++,如有问题或是共同学习,欢迎大家来指正或是讨论。