1. 命名空间
1.1 命名空间
又称为“名字空间”,在内存(全局)中取一块区域并对其进行命名
实际例子:
同一个班级,两个同姓的人,例如:张三和张三,其中一个张三座位是在讲台右边,另外 一个张三座位是在讲台左边(将两个张三,放置在不同的区域里)
程序中,有两个一样的标识符(两个变量),编译器会提示标识符重名的问题,如何解决:将两个标识符放在不同的区域中
C++中的解决:
使用命名空间解决标识符重名的问题
1.1.1 有名空间
关键字:namespace
声明格式:
namespace 命名空间的名称 //名称符合C/C++语法规范即可
{
//代码
}
1.1.1.1 直接访问:访问命名空间中指定的内容
符号:“ :: ”,域作用符号
格式:
命名空间名称 :: 命名空间里的内容;
例如:
namesapce zhangsan
{
int a=10;
}
zhangsan::a //访问名字空间中的变量a
main1.cpp
//直接访问有名空间中的变量
int a = 10;
void function()
{
cout << "全局函数function" << endl;
}
void function1()
{
cout << "这是全局的function1函数" << endl;
}
//有名空间
namespace zhangsan
{
int a = 20;
void function()
{
cout << "命名空间zhangsan中的function函数" << endl;
}
}
//无名空间
namespace
{
void function4()
{
cout << "这是无名的名字空间的function4()" << endl;
}
}
int main()
{
cout << "全局的a="<<a << endl;
cout << "张三命名空间的a=" << zhangsan::a << endl;
function();
function1();
zhangsan::function();//访问有名空间函数
::function4();//访问无名空间函数
return 0;
}
1.1.1.2 通过using关键字访问命名空间中指定的内容
关键字:using
格式:
using 命名空间名称 :: 命名空间中的内容;//将命名空间中的内容导入到using所在的空间中
例如:
using zhangsan ::a;
main1.cpp
//通过using关键字访问命名空间中指定的内容
namespace lisi
{
int sum = 30;
int num = 40;
}
using lisi::sum; //将sum变量导入到当前作用域中
using lisi::num; //注释(取消)快捷键:ctrl+shift+/
int main()
{
cout << "sum=" << sum << endl;
cout << "num=" << num << endl;
return 0;
}
1.1.1.3 通过using和namespace关键字访问命名空间中所有的内容
关键字:using、namespace
格式:
using namespace 命名空间的名称 ; //将命名空间里的所有内容导入到using\namespace所在的作用域(空间)中
例如:
using namespace zhangsan;
//通过using和namespace关键字访问命名空间中所有的内容
namespace lisi {
int b = 30;
}
using namespace lisi;
int main()
{
cout << "b = " << b << endl;
}
1.1.1.4 命名空间也支持嵌套
格式:
namespace 名称1
{
namespace 名称2
{
namespace 名称3
{
............
}
}
}
main1.cpp
//命名空间也支持嵌套
namespace name1
{
int a = 30;
namespace name2
{
int a = 40;
namespace name3
{
int a = 50;
}
}
}
int main()
{
cout << "name1 a=" << name1::a << endl;
cout << "name2 a=" << name1::name2::a << endl;
cout << "name3 a=" << name1::name2::name3::a << endl;
return 0;
}
1.1.1.5 练习
有相同的函数,一个函数实现1 +2+3+ ... +n的和,一个函数实现1 +2+3+ .. +n和的平均数,在main函数调用这两个函数,分别打印他们的和和和的平均数
main2.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "iostream"
using namespace std;
//命名空间
//有相同的函数, - 个函数实现1 + 2 + 3 + ... + n的和, - 个函数实现1 + 2 + 3 + .. + n和的平均数
// , 在main函数调用这两个函数,分别打印他们的和和和的平均数
int sum() {
int num = 0;
int n = 0;
printf("请输入一个数:");
scanf("%d",&n);
for (int i = 1; i <= n;i++) {
num += i;
}
return num;
}
namespace space2 {
float sum() {
int num = 0;
int n = 0;
printf("请输入一个数:");
scanf("%d",&n);
for (int i = 1; i <= n; i++) {
num += i;
}
return num/(float)n;
}
}
int main()
{
cout << "全局的num=" << sum() << endl;
cout << "命名空间的num=" << space2::sum() << endl;
return 0;
}
1.1.2 无名空间
注:全局作用域其实质就是一个无名的名字空间
关键字:namespace
声明格式:
namespace
{
//代码
}