大型项目开发的时候,经常是多人一起开发,命名空间是为了解决命名污染(重名)的问题
名字包括:变量名 函数名 结构名 共用体名 枚举名 类对象名 等
命名空间相当于给名字加了一个姓氏
std是标准命名空间,里面有一些对象的名字,如cout cin endl 等
1.命名空间的使用方式:
1.1命名空间名::对象名
std::cout
1.2 using std::cout;
//声明后,后面多用到cout的地方 表示都是用 std里面的cout
using std::cin;
using std::endl;
1.3 using namespace std;
//表示std命名空间里所有名字都被使用
2.自己编写命名空间
格式:
namespace 命名空间名{
数据类型1 名字1;
数据类型2 名字2;
..
}
例:
#include <iostream>
using namespace std;
namespace Teacher{
char name[32] = "yangfs";
int age = 18;
}
namespace Student{
char name[32] = "qianxy";
int age = 18;
}
using Teacher::name;
using namespace Teacher;
int main(int argc, const char *argv[])
{
//cout<<name<<endl;//有歧义 二意性 会报错
cout<<Teacher::name<<endl;//yangfs
cout<<Student::name<<endl;//qianxy
//cout<<name<<endl;//当 using Teacher::name 后 直接使用name就没问题了
cout<<age<<endl;//当 using namespace Teacher 后 使用Teacher 中所有名字都没问题了
return 0;
}
3.当命名空间里的名字和局部变量的名字冲突时
//使用时遵循 局部优先原则
#include <iostream>
using namespace std;
namespace Student{
char name[32] = "qianxy";
int age = 18;
}
using namespace Student;
int main(int argc, const char *argv[])
{
char name[32] = "zhangsy";
//使用变量遵循 局部优先原则 局部有,就不去命名空间里找了
cout<<name<<endl;
return 0;
}
4.匿名空间
#include <iostream>
using namespace std;
namespace Student{
char name[32] = "qianxy";
int age = 18;
}
using namespace Student;
//没有命名空间的名字 都会被放在 匿名空间
//使用是要 ::变量明 来区分
char name[32] = "zhangsy";
int main(int argc, const char *argv[])
{
cout<<::name<<endl;
return 0;
}
5.命名空间的嵌套使用 ---了解就行
#include <iostream>
using namespace std;
namespace Group{
char name[32] = "tulingjiang";
namespace Student{
char name[32] = "qianxy";
}
}
//using Group::Student::name;
//using namespace Group;//tulingjiang
using namespace Group::Student;//qianxy
int main(int argc, const char *argv[])
{
cout<<name<<endl;
return 0;
}
6.命名空间封函数名
#include <iostream>
using namespace std;
namespace Student{
void function();
}
//命名空间里只有声明
//函数定义写在外面时:要加上 命名空间名::
void Student::function(){
cout<<"hello world"<<endl;
}
using namespace Student;
int main(int argc, const char *argv[])
{
function();
return 0;
}
7.命名空间总结:
1.std::cout
2.using std::cout;
3.using namespace std;
4.当多个命名空间名字冲突,且都被using时,有歧义,需要加 命名空间名::
5.命名空间里的名字和局部变量名字冲突时,采用局部优先原则
6.没有命名空间的名字 都放在 匿名空间里,使用时 ::名字
7.命名空间可以嵌套使用
8.命名空间中一般只包含函数的声明,函数在外面定义是,名字前要加上 命名空间名::