命名空间 namespace

来源:互联网 发布:淘宝查小号信誉 编辑:程序博客网 时间:2024/06/05 12:40

命名空间的意义:避免重名问题
为什么需要将函数定义在命名空间中呢?这其实是为了避免变量或函数重命名的问题。 试想,在一个多人同时开发的项目中,很有可能会出现全局变量或函数重名的现象,而如果每个人都定义了自己的命名空间,就可以解决这个问题,即使重名,只要分属不同的命名空间就不会引起问题。
例如:

#include "iostream"#include"stdlib.h"namespace MySpace{     int a (15);     void  print()     {          std::cout << "我想静静"<<std::endl;     }}namespace MySpaceA{     int a(25);     void  print()     {          std::cout << "AAAAAAAAAA" << std::endl;     }}void main(){     int a (5);     std::cout << "MySpace a=" << MySpace::a << std::endl;     std::cout << "MySpaceA a=" << MySpaceA::a << std::endl;     std::cout << "  main a=" << a << std::endl;     std::cout << "hello world" << std::endl;     MySpace::print();     MySpaceA::print();     system("pause");}

命名空间的别名
如果觉得命名空间名字太长或者太难记等等,可以给命名空间一个别名,调用时,可以使用别名。

namespace TT{     int a(10);}namespace t = TT;//给命名空间起一个别名

命名空间的嵌套
在命名空间下还可以嵌套命名空间。

namespace TT{     int a(10);     namespace T   //命名空间的嵌套     {          int a(9);     }}

命名空间的拓展
命名空间可以拓展,但小心重名。

namespace TT{     int a(10);}namespace TT{     //int a(10);  // 重定义     int y(10);}

命名空间的作用域
using namespace 作用域从上往下,而且必须放在定义之后。

//using namespace MySpace;  // using必须在命名空间的定义后面,因此,此处错误namespace MySpace{     int a(8);}using namespace MySpace;  // using必须在命名空间的定义后面

命名空间的特殊情况:没有命名的命名空间
没有命名的命名空间可以直接调用,这也可以看出命名空间中的数据是公开的,透明的。

//没有命名的命名空间可以直接调用#include"iostream"namespace{     int a(3);     void print()     {          std::cout << "aaa";     }}void main3(){     std::cout << a;     print();}

命名空间的特殊情况:数据是公开的
namespace 所有的数据,函数,类,对象都是共有的,而且不能私有化这些数据。

namespace MySpace{     int  y(5);     int(*padd)(int, int);//函数指针接口//private: 命名空间是透明的,不能有私有成员     int  y1(5);     class myclass     {     public://类默认是私有,实现封装          int a;     };}

struct 结构体默认是透明的,数据是public的,而且可以私有化成员,而namespace不能私有化成员

struct MyStruct{     int b;//结构体默认是透明的private:     int a;//是私有};

C中全局变量的缺点

C 出现重名无法引用全局变量。

#include<stdio.h>int  a = 1;//C 出现重名无法引用全局变量void main(){     int a = 3;     printf("%d",a);     getchar();}

在C++ 中可以是使用 ::调用全局变量

#include<iostream>#include<stdlib.h>//int a = 1;extern  int a; // C++要求严格,声明为全局变量//int a = 10; 可以在别的文件中定义void main(){     int a = 3;     std::cout << ::a; // :: 调用全局的a     system("pause");}

在C++中使用头文件有两种方法
1、用C语言的传统方法
头文件名包括后缀.h,如stdio.h,math.h等。由于C语言没有命名空间,头文件并不存放在命名空间中,因此在C++程序文件中如果用到带后缀.h的头文件时,不必用命名空间,只需在文件中包含所用的头文件即可。
2、用C++的新方法
C++标准要求系统提供的头文件不包括后缀.h,例如iostream、string。为了表示与C 语言的头文件有联系又有区别,C++所用的头文件名是在C语言的相应的头文件名(但不包括后缀.h)之前加一字母c。例如,C语言中有关输入与输出的头文件名为stdio.h在C++中相应的头文件名为cstdio。注意在C++中,头文件cstnng和头文件strmg不是同一个文件。前者提供C语言中对字符串处理的有关函数(如strcmp,ctrcpy)的声明,后者提供C++中对字符串处理的新功能。
此外,由于这些函数都是在命名空间std中声明的,因此在程序中要对命名空间std作声明。
目前所用的大多数C++编译系统既保留了c的用法,又提供丁C++的新方法,但应当提倡使用C++的新方法。

==============================================

0 0