一、引言
在初学C++时,在包含完头文件之后,我们常常会看到这么一句话:using namespace std;
比如:
#include<iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
首先需要声明的是:它不是什么“固定动作”,不是必须这么写的。
二、命名空间
namespace,顾名思义,命名空间。
而using namespace ,则是展开命名空间。
std是C++标准库的命名空间。
因此,using namespace std,就是展开std这个命名空间。
此外,我们也可以定义自己的命名空间:
namespace jiangsu
{
//这里定义的变量还是全局变量,放到静态区
//命名空间可以定义变量、函数、类型
int rand = 0;
int Sub(int x, int y)
{
return x - y;
}
struct Node
{
struct Node* next;
int val;
};
}
同时,命名空间是可以嵌套定义的:
namespace jiangsu
{
//这里定义的变量还是全局变量,放到静态区
//命名空间可以定义变量、函数、类型
int rand = 0;
int Sub(int x, int y)
{
return x - y;
}
struct Node
{
struct Node* next;
int val;
};
namespace N
{
int m;
int n;
int Add(int x, int y)
{
return x + y;
}
}
}
部分展开
using namespace std; 这种就是完全展开,那么就会产生一个弊端:我们在定义或使用某一变量或方法时,会产生一些问题,比如命名冲突等。
此时,我们就需要知道一个东西——“::”
三、域作用限定符(::)
#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
namespace jiangsu
{
//这里定义的变量还是全局变量,放到静态区
//命名空间可以定义变量、函数、类型
int rand = 0;
int Sub(int x, int y)
{
return x - y;
}
struct Node
{
struct Node* next;
int val;
};
namespace N
{
int m;
int n;
int Add(int x, int y)
{
return x + y;
}
}
}
int a = 0;
//可以展开某一个 展开命名空间常用的
using jiangsu::Sub;
int main()
{
jiangsu::rand = 100;
printf("%d \n", jiangsu::rand);// :: - 域作用限定符
int a = 1;
printf("%d\n", a);
printf("%d\n", ::a); //左边是空格,表示从全局域找
int ans = jiangsu::Sub(4, 2);
printf("%d\n", ans);
struct jiangsu::Node node;
ans = jiangsu::N::Add(7, 8);
printf("%d\n", ans);
return 0;
}