namespace概念
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。
在c语言开发中存在一个比较尴尬的局面就是:比如有两个库文件中同时定义了全局变量,那么如果我们在实际开发中要使用到这两个库文件,这时,引用这个变量就变得混淆不清了,c++中怎么避开这个问题发生呢——引入命名空间(全局变量区间不是一个,而是被划分了多个相互独立的全局域),不同的命名空间表示不同的全局区,像std就是一个命名空间,它就标识了一个全局域,如果此时又有另一个命名空间中也定以了cout对象(这里,我自己杜撰一个命名空间——sdc),那么怎么标识程序使用那个命名空间的cout对象呢?——使用 using namespace std;来显示的表明,如果程序中出现了cout,那么一定是std空间全局域中的cout对象,而不会再产生疑惑了。——这就是命名空间的作用。
C中的命名空间
在C语言中只有一个全局作用域
C语言中所有的全局标识符共享同一个作用域
标识符之间可能发生冲突
C++中提出了命名空间的概念
命名空间将全局作用域分成不同的部分
不同命名空间中的标识符可以同名而不会发生冲突
命名空间可以相互嵌套
全局作用域也叫默认命名空间
由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字。 using std::cout; using std::endl; using std::cin; 以上程序可以写成 cout << std::hex << 3.4 << endl;
3、最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写: cout <<hex << 3.4 << endl;因为标准库非常的庞大,所以程序员在选择的类的名称或函数名 时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。
C++命名空间的定义:
namespace name { … }
C++命名空间的使用:
使用整个命名空间:using namespace name;
使用命名空间中的变量:using name::variable;
使用默认命名空间中的变量:::variable
默认情况下可以直接使用默 认命名空间中的所有标识符
1 namespace NameSpaceA 2 { 3 int a = 0; 4 } 5 6 namespace NameSpaceB 7 { 8 int a = 1; 9 10 namespace NameSpaceC 11 { 12 struct Teacher 13 { 14 char name[10]; 15 int age; 16 }; 17 18 } 19 } 20 21 int main() 22 { 23 using namespace NameSpaceA; 24 using NameSpaceB::NameSpaceC::Teacher; //::域作用符 25 26 printf("a = %d\n", a); 27 printf("a = %d\n", NameSpaceB::a); 28 29 Teacher t1 = {"aaa", 3}; 30 31 printf("t1.name = %s\n", t1.name); 32 printf("t1.age = %d\n", t1.age); 33 34 system("pause"); 35 return 0; 36 }
头文件带h后缀和不带h后缀的区别:
带h后缀的文件,是c标准的头文件,它在c++中的存在是为了兼容c开发标准而已,它的内容与不带h后缀的头文件(c++标准头文件)是不同的。
在c++开发中,包含一个标准c++头文件之后,不是说就可以使用在它中定义的标识了,还需要使用namespace 来指定使用那个命名空间,起码需要指明你需要使用到的标识(一般为变量,对象也是变量的一种)是来自那个命名空间。但是c标准中,只有一个全局域,所以没有命名空间一说了,或者说成整个全局域就是它的唯一命名空间。所以不需要再指明命名空间了,但是正如前面说的一样,这样会导致多个头文件下的相同标识引用不清的局面。
总结:
1)当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。若不引入using namespace std ,需要这样做。std::cout。
2) c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
3) C++命名空间的定义: namespace name { … }
4) using namespace NameSpaceA;
5)namespce定义可嵌套。