我们来看一下这一段代码:
int rand = 0;
int main()
{
printf("%d", rand);
return 0;
}
运行结果如下:
当我们添加一个头文件stdlib.h时,运行结果如下:
我们可以发现,报错了。这里的问题出现在我们在全局定义了一个变量rand.并且导入了一个头文件stdlib.h
在stdlib.h这个头文件中有一个rand()函数。在运行时,printf(“%d”, rand),这里的rand用的是函数rand().所以报错。这里我们在全局定义的rand变量名字就和我们的rand()函数名字重复了。在C语言中很经常会出现我们定义的变量或者函数和头文件中的变量和函数名字重复。那么在C++中namespace关键字就可以解决这个问题。具体用法是:
namespace haohaoxuexi
{
//这里的haohaoxuexi可以换成自己想要的名字
}
然后我们在namespace中定义我们需要的变量或者函数:
namespace haohaoxuexi
{
int rand = 0;
}
int main()
{
printf("%d", haohaoxuexi::rand);
return 0;
}
运行结果如下:
我们发现可以正常运行,原理是namespace关键字生成了一个域。在不同域中可以定义相同的名字,在同一个域中不可以定义相同的名字。我们可以把域理解成地盘
在上述代码块中有一句代码:
printf("%d", haohaoxuexi::rand);
在这句代码中,小伙伴可以发现有个符号" :: ",这个符号的名字是域作用符,它可以帮助程序找到对应域中的变量或函数等… … 用法是域作用符的左边写上域名,右边写上需要的变量或函数。(namespace只要为了解决名字冲突的问题都可以放进来,不局限于变量和函数,结构体也行)
接下来大家看一下这个代码:
int a = 100;
namespace hh
{
int a = 50;
}
int main()
{
int a = 25;
printf("%d\n", a);
printf("%d\n", hh::a);
printf("%d\n", ::a);
return 0;
}
这段代码的运行结果如下:
我们可以发现分别打印的是25、50、100。我给大家讲解一下为什么结果是这些数。第一个打印语句里面没有域操作符,所以会先在当前的main()函数中找a,找到了a = 25.(若我们没有在main()函数中定义a,则会去全局域中查找,找到了a = 100)打印a :
1、在main()函数中有定义a的结果:
2、没有在main()函数中定义a的结果:
在第二个打印语句中,有域作用符并且在域作用符左遍有域名hh,右边有a。所以在这个打印语句中它会去hh域中查找a,找到了a = 50,并打印出来
在第三个打印语句中我们发现在域作用符的左边没有域名。这时候会默认去全局域中查找a,找到了a = 100,并打印
在用namespace关键字可以嵌套使用。如下:
namespace hh
{
namespace mm
{
int a = 0;
}
}
那该如何使用mm域中的元素呢?
比如说我现在要打印变量a,我们知道变量a在mm域中,我们可以使用域作用符mm::a。域mm在域hh中,我们用域作用符hh::mm::a。最终就可以找到hh域中的mm域中的变量a
代码如下:
namespace hh
{
namespace mm
{
int a = 0;
}
}
int main()
{
printf("%d", hh::mm::a);
return 0;
}
运行结果如下:
接下来我们再看一段代码:
namespace hh
{
int a = 20;
}
int main()
{
printf("%d\n", hh::a);
printf("%d\n", hh::a);
printf("%d\n", hh::a);
printf("%d\n", hh::a);
return 0;
}
当我们想要多次使用变量a时,我们发现每次使用都需要用上域作用符。在使用时会很麻烦。当我们要多次使用域中的元素时,我们可以用using关键字。
namespace hh
{
int a = 20;
}
using namespace hh;
int main()
{
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
return 0;
}
运行结果如下:
using关键字的作用可以理解为把这个域打开一个口子,与外部的全局域相通。这样我们就不需要使用域作用符了。但这里需要注意的是,在对域使用using关键字时,在全局域中不能有同名元素,不然会名字冲突。例子:
namespace hh
{
int a = 20;
}
int a = 8;
using namespace hh;
int main()
{
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
return 0;
}
运行结果如下:
在使用using关键字的时候也可以单独对域中的某个元素使用比如在hh域中有两个变量a和b。
namespace hh
{
int a = 20;
int b = 40;
}
int b = 10;
int main()
{
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
在这个代码块中,我们想要多次使用hh域中的a和单独使用hh域中的b。按原来的写法我们可以用
using namespace hh来把hh域和全局域相同,但这里我们发现在全局域中定义了变量b。若我们用
using namespace hh,会导致变量b的名字冲突。这时候我们可以用using关键字单独把变量a与全局域相通。
using hh::a;
由于hh域中的变量b没法使用using关键字,所以就只能使用域作用符了。代码如下:
namespace hh
{
int a = 20;
int b = 40;
}
int b = 10;
using hh::a;
int main()
{
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", hh::b);
return 0;
}
结果如下:
这篇文章到此就结束啦,如果对你有帮助,麻烦给我一个赞和收藏。3Q (─‿‿─)