c++命名空间作用域理解

大型程序是通过模块组合构成的,在不同模块可能产生同名函数容易引发歧义,这里就引入命名空间作用域的概念,一个命名空间确定一个命名空间作用域,凡是在该命名空间之内声明的,不属于前面所描述的各个作用域的标识符,都属于该命名空间的作用域。在命名空间内部可以直接引用当前命名空间的标识符。

例如:c++中using namespace std;

C++标准程序库中的所有标识符都被定义于一个名为std的namespace中(namespace是指标识符的各种可见范围)

作用:在使用时,该头文件没有定义全局命名空间,必须使用namespace std,这样才能使用类似于 cout,cin 等这样的C++标识符。

c++提供using语句的两种形式

  1. using 命名空间名 ::标识符名;将指定的标识符暴露在当前的作用域内,使得在当前作用域可以直接引用该标识符;
  2. using namespace 命名空间名;将指定命名空间内的所有标识符暴露在当前的作用域内,使得在当前作用域中可以直接引用该命名空间内的任何标识符。

两种特殊的命名空间

  1. 全局命名空间:默认的命名空间,在显式声明的命名空间之外声明的标识符都在一个全局命名空间中。
  2. 匿名命名空间:一个需要显式声明的没有名字的命名空间,匿名命名空间常被用来屏蔽不希望暴露给其他源文件的标识符。
#include "Fasdsad.h"
#include 
Fasdsad::Fasdsad()
{
}

Fasdsad::~Fasdsad()
{
}
using namespace std;
int i;    
int k = 100;

namespace Mode {                //声明模块
	int j;                      //Mode命名空间的全局变量;
}
int main() {
	i = 5;
	Mode::j = 4;
	{
		using namespace Mode;
		int i = 2;
		j = 10;
		int f = 20;
		cout << "i=" << i << endl;             //显示i=2,说明具有局部作用域的变量可以把具有全局作用域的变量隐藏
		cout << "j=" << j << endl;
		cout << "k=" << k << endl;             //显示k=100,全局命名空间中的变量在Mode命名空间中可以调用。
	}
	cout << "i=" << i << endl;
//	cout << "f=" << f << endl;                 //加上这句报错,在Mode命名空间中的申请的变量在全局命名空间中不能够访问。
	system("pause");
	return 0;
}

 作用域关系:命名空间作用域>类作用域>局部作用域

作用域和可见性原则不只实用于变量名,也适用于其他各种标识符,包括常量名、用户定义的类型名、函数名、及枚举类型的取值等。

 

你可能感兴趣的:(C++回顾)