在 C + + 中使用: : (范围解析运算符)

我正在学习 C + + ,我从来不知道什么时候我需要使用 ::。我知道我需要在 coutcin之前使用 std::。这是否意味着在 iostream文件中,创建它的开发人员创建了一个名称空间 std,并将函数 cincout放入名称空间 std中?当我创建一个新的类,不是在同一个文件作为 main()出于某种原因,我必须添加 ::

例如,如果我创建一个名为 Aclass,为什么我需要把 A::放在我创建的函数前面,即使我没有把它放到名称空间中?例如 void A::printStuff(){}。如果我在 main中创建一个函数,为什么我不必放入 main::printStuff{}

我知道我的问题可能让人困惑,但有人能帮帮我吗?

205968 次浏览

::称为范围解析运算符。 可以这样使用:

:: 标识符
Class-name :: < em > 标识符
名称空间 :: < em > 标识符

你可以在这里读到
Https://learn.microsoft.com/en-us/cpp/cpp/scope-resolution-operator?view=vs-2017

你对 coutcin的看法基本上是正确的。它们是在 std名称空间内定义的对象(而不是函数)。下面是 C + + 标准定义的声明:

标题 <iostream>概要

#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>


namespace std {
extern istream cin;
extern ostream cout;
extern ostream cerr;
extern ostream clog;


extern wistream wcin;
extern wostream wcout;
extern wostream wcerr;
extern wostream wclog;
}

::被称为 作用域解析运算符。名称 coutcin是在 std中定义的,因此我们必须用 std::限定它们的名称。

类的行为有点像名称空间,因为类中声明的名称属于类。例如:

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

名为 foo的构造函数是名为 foo的类的 成员。它们具有相同的名称,因为它是构造函数。函数 bar也是 foo的一个成员。

因为他们是 foo的成员,当我们从课外提到他们时,我们必须限定他们的名字。毕竟,他们属于那个阶层。因此,如果要在类之外定义构造函数和 bar,就需要这样做:

foo::foo()
{
// Implement the constructor
}


void foo::bar()
{
// Implement bar
}

这是因为它们被定义为 在外面类。如果您没有将 foo::限定放在名称上,那么您将在全局范围内定义一些新函数,而不是作为 foo的成员。例如,这是完全不同的 bar:

void bar()
{
// Implement different bar
}

它允许与 foo类中的函数具有相同的名称,因为它位于不同的作用域中。这个 bar在全局范围内,而另一个 bar属于 foo类。

::用于取消引用范围。

const int x = 5;


namespace foo {
const int x = 0;
}


int bar() {
int x = 1;
return x;
}


struct Meh {
static const int x = 2;
}


int main() {
std::cout << x; // => 5
{
int x = 4;
std::cout << x; // => 4
std::cout << ::x; // => 5, this one looks for x outside the current scope
}
std::cout << Meh::x; // => 2, use the definition of x inside the scope of Meh
std::cout << foo::x; // => 0, use the definition of x inside foo
std::cout << bar(); // => 1, use the definition of x inside bar (returned by bar)
}

无关的: Cout 和 cin 不是函数,而是流对象的实例。

看看它是信息[合格的标识符

限定 id 表达式是一个由范围解析运算符: : 和可选的、由范围解析运算符分隔的枚举序列(因为 C + + 11)类或名称空间名称或声明类型表达式(因为 C + + 11)预置的非限定 id 表达式。例如,表达式 std: : string: : npos 是一个表达式,它在名称空间 std 中命名类字符串中的静态成员 npos。在全局名称空间中,表达式: : tolower 命名函数。表达式: : std: : cout 命名名称空间 std 中的全局变量 cout,这是一个顶级名称空间。表达式 ost: : signals2: : connect 命名在名称空间 signals2中声明的类型连接,该类型连接在名称空间升级中声明。

关键字模板可能出现在必要的限定标识符中,以消除依赖模板名称的歧义] 1

“一元范围解析运算符”或“冒号运算符”的一个用法是用于选择相同名称的局部和全局变量:

    #include <iostream>
using namespace std;
    

int variable = 20;
    

int main()
{
float variable = 30;
    

cout << "This is local to the main function: " << variable << endl;
cout << "This is global to the main function: " << ::variable << endl;
    

return 0;
}

由此产生的结果将是:

这是主函数的本地函数: 30

这是主函数的全局值: 20

其他用途可以是: 从类的外部定义函数、访问类中的静态变量或使用多重继承。