What is the meaning of prepended double colon “::”?
我在一个必须修改的类中发现了这行代码:
1 | ::Configuration * tmpCo = m_configurationDB;//pointer to current db |
我不知道在类名前面加上双冒号的确切含义是什么。如果没有这个,我会读到:
我还发现:
1 | typedef ::config::set ConfigSet; |
这样可以确保从全局命名空间进行解析,而不是从当前所在的命名空间开始。例如,如果您有两个不同的类,称为
1 2 3 4 5 6 7 8 9 10 11 12 | 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(...) } } |
基本上,它允许您遍历到全局名称空间,因为您的名称可能会被另一个名称空间内的新定义(在本例中是
例子:
1 2 3 4 5 6 7 8 | 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; } |
已经有很多合理的答案了。我将加入一个可以帮助一些读者的类比。当您在路径中搜索要运行的程序时,
1 | /path/to/executable |
这是非常明确的——无论路径是什么,只有文件系统树中该位置的可执行文件才能匹配此规范。类似地…
1 | ::std::cout |
……在C++命名空间"树"中同样显式。
与这些绝对路径相比,您可以配置好的unix shell(例如zsh)来解析当前目录下的相对路径或
1 | X11/xterm |
…如果找到,会很高兴地运行
1 | std::cout |
…可以在任何一个
值得注意的差异:
1)壳牌倾向于使用EDCOX1(2)中的排序来使用第一匹配,而C++在您不明确时给出编译器错误。
2)在C++中,没有任何超前范围的名称可以在当前命名空间中匹配,而大多数UNIX shell只在EDOCX1 2中插入EDOCX1×18。
3)C++总是搜索全局命名空间(就像EDCOX1,1,隐式的EDCOX1,2)一样。
符号的名称空间和显式性的一般讨论使用absolute
和许多事情一样,这是一种平衡行为。C++标准在EDOCX1的23个标识符下放置了比EDCOX1(15)更不"唯一"的标识符,程序员可能会使用它们代码中完全不同的东西(例如EDCOX1,25,EDCOX1,26,EDCOX1,27,EDCX1,28,EDOCX1,29,EDCX1,30,EDCX1,31,EDCOX1 32)。两个不相关的非标准库使用相同的标识符的可能性要高得多,因为作者通常不了解或不太了解彼此。库(包括C++标准库)随时间改变它们的符号。所有这些都可能在重新编译旧代码时产生歧义,特别是在大量使用
因此,一个领先的EDCOX1(0)是C++程序员工具箱中的一个工具,用来主动消除已知的冲突,和/或消除未来歧义的可能性。
例如,只有
some 是一个名称空间(在全局范围内,或是一个比当前范围更大的外部范围内),thing 是一个类型、函数、对象或嵌套的名称空间;some 是当前范围内可用的类,thing 是some 类的成员对象、函数或类型;- 在类成员函数中,
some 可以是当前类型(或当前类型本身)的基类型,而thing 则是该类、类型、函数或对象的一个成员。
也可以有嵌套的作用域,如
因此,回到您的示例,
使用它的方式表明(在指针声明中使用)它是全局范围中的类型。
我希望这个答案是完整和正确的,足以帮助您理解范围解析。
如果在
例如。:
它被称为作用域解析操作符,使用作用域解析操作符可以引用隐藏的全局名称:例如;
1 2 3 4 5 6 7 8 | int x; void f2() { int x = 1; // hide global x ::x = 2; // assign to global x x = 2; // assign to local x // ... } |
(这个答案主要是针对谷歌,因为OP已经解决了他的问题。)预先准备好的
意思是"从全局名称空间中取名字,而不是其他任何东西"。但为什么这需要明确拼写?
用例-命名空间冲突
在全局命名空间和本地/嵌套命名空间中使用相同的名称时,将使用本地名称。所以,如果你想要全球性的,就用
用例-强调非成员函数
在编写成员函数(方法)时,对其他成员函数的调用和对非成员(自由)函数的调用看起来类似:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class A { void DoSomething() { m_counter=0; ... Twist(data); ... Bend(data); ... if(m_counter>0) exit(0); } int m_couner; ... } |
但也有可能是
为了使这一点更加突出,我们可以编写
例如,如果要使用cout而不在代码中提及
1 | std::cout <<"test"; |
当没有提到名称空间时,就说类属于全局名称空间。
"::"表示范围解析运算符。具有相同名称的函数/方法可以在两个不同的类中定义。要访问特定类范围的方法,使用解析运算符。