归属专栏:浅尝C++
个人主页:Jammingpro
记录一句:写这篇博客好困,真的好困
文章前言:本篇文章介绍C++中的命名空间,每个介绍的小点,在可能的情况下,都附上代码了。
在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
我们来看一段代码
#include
#include
int rand = 100;
int main()
{
printf("%d\n", rand);
return 0;
}
上述代码运行之后会报错,因为这里定义的全局变量rand
和stdlib头文件中的rand函数
重名了。为了解决重名的问题,C++隆重推出命名空间,也就是namespace
,以解决这个问题。
定义命名空间,需要使用到namespace
关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间里可以放变量、函数、类型(也就是类、结构体等)。看看下面的代码示例
namespace jammingpro
{
int num = 10;
void sayHello()
{
cout << "Hello,家人们!" << endl;
}
class XiaoMing
{
public:
string getName()
{
return m_name;
}
private:
string m_name;
};
struct Node
{
int val;
Node* next;
};
}
类似于if语句里面嵌套if语句,下面看看怎么嵌套命名空间
namespace outlayer
{
int num = 1;
namespace innerlayer
{
int val = 0;
}
}
如果在一个工程下定义多个同名的命名空间,编译器会合并成一个命名空间。如果我在jammingpro.h中定义了命名空间xiaoming,在jammingpro.cpp中又定义了命名空间xiaoming,就像下面这样
jammingpro.h中的代码片段
namespace xiaoming
{
int nice = 1;
}
jammingpro.cpp中的代码片段
namespace xiaoming
{
int re = 0;
}
在我们编译之后,就会被合并到一起,也就是这样的
namespace xiaoming
{
int nice = 1;
int re = 0;
}
上面只介绍了怎么定义名称空间,那么名称空间又该怎么使用呢?下面介绍了3种使用名称空间的方法。为了方便下面的介绍,这里先给出我定义的命名空间
namespace xiaoming
{
int num = 1;
int re = 0;
}
下面用到的::
就是作用域限定符,作用域限定符前为命名空间的名字,后面为要使用变量、函数或类型。
int main()
{
printf("%d and %d\n", xiaoming::num, xiaoming::re);
return 0;
}
如果xiaoming
中的num
经常使用,那么我们可以考虑使用using
引入num
。这样,我们就不用每次都写上num
对应的命名空间了。
using xiaoming::num;
int main()
{
printf("%d\n", num);
return 0;
}
如果xiaoming
这个命名空间中的很多成员都需要使用到,这时候可以使用using namespace xiaoming
这个语句,这样就可以引入该命名空间中的所有成员了。
using namespace xiaoming;
int main()
{
printf("%d and %d\n", num, re);
}
文章结语:这篇文章对C++中命名空间的定义和使用做了介绍。如果上述内容有任何问题,欢迎在下方留言区指正b( ̄▽ ̄)d