在 C++ 中,命名空间是一种用于避免命名冲突和组织代码的机制。C++命名空间可以通过带双引号和不带双引号的方式来定义和使用。
但有时会看到如下代码:
info();
::info();
上面的代码有何区别呢?下面给出具体代码给出说明:
不想看过程的直接跳转到文末。
#include <iostream>
using namespace std;
void info()
{
std::cout << "out namespace!\n";
}
namespace ls {
class Person
{
public:
void info();
void GetInfo();
private:
int age;
};
}
int main()
{
ls::Person p;
p.GetInfo();
}
void ls::Person::info()
{
cout << "in ls namespace" << endl;
}
void ls::Person::GetInfo()
{
// 不同点
info(); // in info 命名空间内函数
::info(); // out namespace! 全局函数
}
输出结果:
in info
out namespace!
结果分析:
::info()
; 在 GetInfo()
成员函数中调用了全局函数 info()
,使用作用域解析运算符 ::
指定使用全局命名空间中的 info()
函数。
void info()
是全局函数 info()
的实现。
::
解析符前没有命名作用域表示会调用命名空间外的全局函数,而不带作用域解析符表示默认使用命名空间内的函数。