1、为什么需要namespace?
namespace解决的全局变量和函数命名冲突的问题,namespace功能就像身份证一样,即使全国有100个人跟你同名,但是你的身份证号是唯一的,身份证记录你的出身省份、出身日期等等信息。
2、c++和c解决命名冲突的方式有何不同?
c++是namespace命名空间,说白了,先定义一个篮子,篮子里面放东西,这得要求每个篮子都是唯一的,而篮子之间里面的东西可以相同。
c语言没有关键字能解决这个问题。所以,一个c语言的项目,尽可能一个人写;定义的全局变量,前面加上前缀;不需要外部访问的函数加上static。
c++和c语言相比之下,c++解决的方法是从语言出发,而c语言解决的方法是从人出发。
3、namespace的用法
-
namespace语法
namespace xxx{ int a};
-
访问变量的方式:
1.xxx::a = 10; (::是用来连接作用域和作用域里面的内容)
2.using xxx::a; 然后就能直接使用 a;(using相当于告诉编译器,编译a的时候,要在xxx里面找)
3.using namespace xxx; (xxx里面的内容可以直接使用,啥也不用加,相当于将xxx的内容全部裸露出来)第一种方式和第三种方式最常用。第一种省去了using,第三种直接省去定义域,而第二种,有种夹在中间的感觉。
实验一:使用方式1和2访问
namespace np
{
void func1()
{
}
void func2()
{
func1();
}
};
using np::func2;
int main(void)
{
np::func1();
func2();
return 0;
}
实验二:使用方式3访问
namespace np
{
void func1()
{
}
void func2()
{
func1();
}
};
using namespace np;
int main(void)
{
func1();
func2();
return 0;
}
实验三:func2实体在命名空间之外实现,func2在命名空间里声明
namespace np
{
void func1()
{
}
void func2();
};
void func2()
{
func1();
}
using namespace np;
int main(void)
{
func1();
func2();
return 0;
}
实验四:不用文件之间使用namespace
//test2.cpp
namespace np2
{
void func3()
{
}
};
//test1.cpp
//namespace np2; //编译器不承认这个语法,后面要有一个{}
//extern namespace np2; //编译器不承认这个语法,后面要有一个{}
//namespace np2{}; //编译器提示 func3函数没声明,意味着,np2命名空间在test1中重新定义
//extern namespace np2{}; //编译器不承认这个语法,没有声明np2里面的东西
//namespace np2{void func3();}; //编译可以通过,但这种相当于np2命名空间在test1中重新定义,func3在test1中寻找
namespace np2{extern void func3();}; //编译器可以通过,func3在外部寻找。
using namespace np2;
int main(void)
{
func3(); //test2文件
return 0;
}
跟C语言的思路一样,先声明外部的变量才去使用。声明是为了编译时候能通过,才能去链接。
4.最后
C++复杂就复杂它的特性,同时它的特性越复杂,说明它能解决的问题越多。