在函数调用中添加“::”在C ++中做什么?

时间:2011-11-25 21:43:27

标签: c++ syntax namespaces

  

可能重复:
  What is the meaning of prepended double colon “::” to class name?

我一直在研究遗留的C ++代码,它有类似的东西:

::putenv(local_tz_char);
::tzset();

在函数调用中添加“::”的语法是什么意思? Google-fu让我失望。

6 个答案:

答案 0 :(得分:7)

也称为Scope resolution operator

  

在C ++中用于定义已经声明的成员函数(在   特定类的.hpp或.h扩展名的头文件。   在.cpp文件中,可以定义通常的全局函数或   该类的成员函数。区分正常   函数和类的成员函数,一个需要使用   范围解析运算符(::)在类名和。之间   成员函数名称,即ship :: foo()其中ship是一个类而foo()   是该类船的成员函数。

维基百科的例子:

#include <iostream>

// Without this using statement cout below would need to be std::cout
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
}

答案 1 :(得分:7)

这意味着编译器将在全局命名空间中查找函数putenv()tzset()

示例

#include <iostream>

using namespace std;

//global function
void foo()
{
    cout << "This function will be called by bar()";
}

namespace lorem
{
    void foo()
    {
        cout << "This function will not be called by bar()";
    }

    void bar()
    {
        ::foo();
    }
}

int main()
{
    lorem::bar(); //will print "This function will be called by bar()"
    return 0;
}

答案 2 :(得分:3)

昨天(+一年)就类似的问题进行了讨论。也许你可以在这里找到一个更深入的答案。

What is the meaning of prepended double colon "::"?

答案 3 :(得分:2)

这意味着:在全局命名空间中查找函数。

答案 4 :(得分:1)

它将使用特定的非限定名称(与使用using关键字导入的任何内容相对)。

答案 5 :(得分:0)

::是范围解析运算符,它告诉编译器在什么范围内找到该函数。

例如,如果你有一个带有局部变量var的函数并且你有一个同名的全局变量,你可以选择通过预先设置范围解析运算符来访问全局变量:

int var = 0;

void test() {
    int var = 5;
    cout << "Local: " << var << endl;
    cout << "Global: " << ::var << endl;
}

IBM C ++编译器文档就像这样(source):

  

::(范围解析)运算符用于限定隐藏名称   你仍然可以使用它们。如果a,您可以使用一元范围运算符   命名空间范围或全局范围名称由显式隐藏   在块或类中声明相同的名称。

对于类中的方法和外部相同名称的版本,也可以这样做。如果您想访问特定命名空间中的变量,函数或类,可以像下面这样访问它:<namespace>::<variable|function|class>

有一点需要注意,即使它是一个运算符,它也不是可以重载的运算符之一。