我在一个类中发现了这一行代码,我必须修改:
::Configuration * tmpCo = m_configurationDB;//pointer to current db
我不知道类名前的双冒号是什么意思。如果没有,我会读到:声明tmpCo作为类Configuration对象的指针…但是前面的双冒号把我弄糊涂了。
我还发现:
typedef ::config::set ConfigSet;
我在一个类中发现了这一行代码,我必须修改:
::Configuration * tmpCo = m_configurationDB;//pointer to current db
我不知道类名前的双冒号是什么意思。如果没有,我会读到:声明tmpCo作为类Configuration对象的指针…但是前面的双冒号把我弄糊涂了。
我还发现:
typedef ::config::set ConfigSet;
当前回答
这确保解析是从全局名称空间进行的,而不是从您当前所在的名称空间开始。例如,如果你有两个不同的类叫做Configuration:
class Configuration; // class 1, in global namespace
namespace MyApp
{
class Configuration; // class 2, different from class 1
function blah()
{
// resolves to MyApp::Configuration, class 2
Configuration::doStuff(...)
// resolves to top-level Configuration, class 1
::Configuration::doStuff(...)
}
}
基本上,它允许您遍历全局名称空间,因为您的名称可能会被另一个名称空间(在本例中是MyApp)中的新定义所破坏。
其他回答
(这个答案主要是给谷歌人的,因为OP已经解决了他的问题。) 前置的::-作用域结果运算符-的含义已经在其他答案中描述过,但我想补充一下人们为什么使用它。
意思是“从全局命名空间取名称,而不是其他任何名称”。但是为什么需要明确地拼写呢?
用例-名称空间冲突
当全局命名空间和本地/嵌套命名空间中有相同的名称时,将使用本地名称空间。所以如果你想要全局的,在它前面加上::。这个案例在@Wyatt Anderson的回答中有描述,请看他的例子。
用例强调非成员函数
当你编写一个成员函数(一个方法)时,调用其他成员函数和调用非成员(free)函数看起来很像:
class A {
void DoSomething() {
m_counter=0;
...
Twist(data);
...
Bend(data);
...
if(m_counter>0) exit(0);
}
int m_couner;
...
}
但也有可能Twist是a类的姐妹成员函数,而Bend是一个自由函数。也就是说,Twist可以使用和修改m_counter,而Bend不能。因此,如果你想确保m_counter保持为0,你必须检查Twist,但你不需要检查Bend。
因此,为了使它更明显,可以这样写->Twist,向读者表明Twist是一个成员函数,或者写::Bend,表明Bend是自由函数。或两者兼而有之。这在您执行或计划重构时非常有用。
::是定义命名空间的运算符。
例如,如果您想使用cout而不提及使用名称空间std;在你的代码中,你这样写:
std::cout << "test";
当没有提到命名空间时,就说该类属于全局命名空间。
运算符被称为作用域解析运算符,它的作用就是解析作用域。因此,通过在type-name前面加上this,它告诉编译器在全局命名空间中查找类型。
例子:
int count = 0;
int main(void) {
int count = 0;
::count = 1; // set global count to 1
count = 2; // set local count to 2
return 0;
}
一个隐藏的全局名称可以使用作用域解析操作符引用:: 例如;
int x;
void f2()
{
int x = 1; // hide global x
::x = 2; // assign to global x
x = 2; // assign to local x
// ...
}
这确保解析是从全局名称空间进行的,而不是从您当前所在的名称空间开始。例如,如果你有两个不同的类叫做Configuration:
class Configuration; // class 1, in global namespace
namespace MyApp
{
class Configuration; // class 2, different from class 1
function blah()
{
// resolves to MyApp::Configuration, class 2
Configuration::doStuff(...)
// resolves to top-level Configuration, class 1
::Configuration::doStuff(...)
}
}
基本上,它允许您遍历全局名称空间,因为您的名称可能会被另一个名称空间(在本例中是MyApp)中的新定义所破坏。