命名空间
在C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”
命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
//定义一个名字为A的命名空间(变量、函数)
namespace A
{
int a = 100;
}
namespace B
{
int a = 200;
}
void test02()
{
//A::a a是属于A中
cout<<"A中a = "<<A::a<<endl;//100
cout<<"B中a = "<<B::a<<endl;//200
}
命名空间只能全局范围内定义
下面就是错误的写法 (局部定义命名空间是错误的)
int main()
{
namespace A //局部定义命名空间是错误的
{
int a = 1;
}
namespace B
{
int a = 2;
}
count << "A::a : " << A::a << endl;
count << "B::a : " << B::a << endl;
return 0;
}
命名空间可以嵌套定义
namespace A
{
int a = 1000;
namespace B
{
int a = 2000;
}
}
void test03()
{
cout<<"A中的a = "<<A::a<<endl; //1000
cout<<"B中的a = "<<A::B::a<<endl; //2000
}
允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
namespace A
{
int a = 100;
int b = 200;
}
namespace A
{
int c = 300;
}
void test04()
{
cout<<"A中a = "<<A::a<<endl;//100
cout<<"A中c = "<<A::c<<endl;//200
}
命名空间可以存放的变量类型
在C++中,命名空间(namespace)可以存放各种类型的变量,包括但不限于以下类型
1.基本数据类型变量,如整型(int)、浮点型(float)、字符型(char)等
2.自定义的结构体(struct)或类(class)的对象
3.枚举类型(enum)的变量。
4.指针类型变量,可以指向不同类型的数据
5.数组类型变量,可以是一维或多维数组。
6.函数指针类型,指向特定函数的指针。
7.类型别名(typedef)或类型定义(using)。
命名空间中的函数 可以在“命名空间”外 定义
namespace A
{
int a=100;//变量
void func();
}
void A::func()//成员函数 在外部定义的时候 记得加作用域
{
//访问命名空间的数据不用加作用域
cout<<"func-a = "<<a<<endl;
}
void funb()//普通函数
{
cout<<"funb-a = "<<A::a<<endl;
}
void test06()
{
A::func();
funb();
}
无名命名空间
意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识符加上了static,使得其可以作为内部连接
namespace
{
int a = 10;
void func()
{
cout<<"hello namespace"<<endl;
}
}
void test()
{
//只能在当前源文件直接访问a 或 func
cout<<"a = "<<a<<endl;
func();
}
命名空间的使用
使用using将命名空间中某个成员引入
namespace N
{
// 命名空间中可以定义变量/函数/类型
int a = 0;
int b = 1;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
使用using namespace 命名空间名称 引入
namespace N
{
// 命名空间中可以定义变量/函数/类型
int a = 0;
int b = 1;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
using namespce N;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
Add(10, 20);
return 0;
}