为什么会写 :: 而没有前置的命名空间?(例如 ::atof)

32
如果你去看这个帖子的被接受的答案,
有人可以详细解释一下他为什么使用:
double temp = ::atof(num.c_str());

而不仅仅是这样
double temp = atof(num.c_str());

此外,当您使用“纯粹”的全局函数时,使用该语法被认为是一种良好的实践吗?

4
关于直接回答链接,请在答案底部的左下角查找“链接”链接。 - Jonathon Faust
2
请将下面的程序相关内容从英语翻译成中文。只返回已翻译的文本:像这样:https://dev59.com/V3NA5IYBdhLWcg3wUMDn#1012604 - Otávio Décio
1
答案后面有一个小文本,写着“链接”。 - Skilldrick
1
每个答案下面都有一个名为“链接”的链接,这将为您提供永久链接。 - Will Vousden
3
std::atof()是什么意思呢?::atof()的意思是你已经包含了<stdlib.h>并且想要全局版本,std::atof()的意思是你已经包含了<cstdlib>(像一个好的C++程序员)并且想要在std命名空间中的版本。 - D.Shawley
显示剩余2条评论
5个回答

43

它说应该使用全局版本,而不是在本地范围中声明的版本。因此,如果有人在您的类中声明了一个atof,这将确保使用全局的那个。

请看维基百科关于此主题的内容

#include <iostream>

using namespace std;

int n = 12;   // A global variable

int main() {
    int n = 13;   // A local variable
    cout  << ::n << endl;  // Print the global variable: 12
    cout  << n   << endl;  // Print the local variable: 13
}

19

很有趣,微软和维基百科的例子几乎是一样的 - 我想知道是哪个抄袭了哪个? - Skilldrick
2
最有趣的事情是,这可能应该是C++中的std::atof() ;) - D.Shawley

6

:: 运算符是作用域解析运算符。

当与类说明符一起使用(如 A::a),它用于访问类 A 的数据成员 a。 当未使用任何说明符时,它访问全局变量。

它主要用于以下情况。

  1. 引用全局变量。
  2. 引用类的静态成员。
  3. 避免二义性,当一个类从多个[非虚基类]继承时
  4. 使用指令,以在派生类中使用基类函数,当基类中有一个和派生类同名但类型不同的函数时。
  5. 访问全局范围内定义的函数,当你有一个与之具有相同签名的函数时,例如 double temp = ::atof(num.c_str());
  6. 创建嵌套类的对象。

1

::func() 表示此函数不属于特定类。当存在多个同名函数时,为了避免与特定成员函数混淆,您可以在函数名前加上作用域运算符来指定所需的函数。


来自C++ Primer第四版,第17.2.1节:

在全局范围内定义的名称 - 在任何类、函数或命名空间之外声明的名称 - 在全局命名空间中定义。全局命名空间被隐式声明,并存在于每个程序中。定义全局范围实体的每个文件都会将这些名称添加到全局命名空间中。

作用域运算符可用于引用全局命名空间的成员。由于全局命名空间是隐式的,因此它没有名称;表示法为

::member_name

指的是全局命名空间中的成员。


1
假设您有两个版本的函数f(),一个定义在命名空间外,另一个定义在命名空间内。现在假设您在同一命名空间中有另一个函数g()。如果您在g()内部调用f(),它将调用在同一命名空间中定义的那个函数。但是,如果您想调用全局版本,则需要执行::f()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接