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