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

在C+中使用::+; 我学习C++,我永远不知道什么时候需要使用::我知道我需要在cout和cin前面使用std::。这是否意味着在iostream文件中,创建它的开发人员创建了一个名为std的命名空间,并将函数cin和cout放入名为std的命名空间中?当我创建了一个与main()不在同一文件中的新类时,出于某种原因,我必须添加:,c++,function,namespaces,C++,Function,Namespaces,例如,如果我创建了一个名为a的类,为什么我需要将a::放在我创建的函数前面,即使我没有将它放在名称空间中?例如void A::printStuff(){}。如果我在main中创建一个函数,为什么不把main::printStuf{}放进去呢 我知道我的问题可能让人困惑,但有人能帮我吗?这个:叫做范围解析操作符。 可以这样使用: :标识符 类名::标识符 名称空间:标识符 您可以在这里阅读相关内容 关于cout和cin你说得很对。它们是std命名空间中定义的对象(不是函数)。下面是C++标准定义的

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


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

这个
叫做范围解析操作符。 可以这样使用:

标识符
类名
::
标识符
名称空间
标识符

您可以在这里阅读相关内容

关于
cout
cin
你说得很对。它们是
std
命名空间中定义的对象(不是函数)。下面是C++标准定义的声明:

标题
概要

#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;
}
名为
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
类中的函数同名,因为它位于不同的作用域中。此
在全局范围内,而另一条
属于
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)
}
const int x=5;
名称空间foo{
常数int x=0;
}
整型条(){
int x=1;
返回x;
}
结构Meh{
静态常数int x=2;
}
int main(){
标准:cout 5
{
int x=4;
标准:cout 4
std::cout 5,这一个查找当前范围之外的x
}
std::cout 2,在Meh范围内使用x的定义
std::cout 0,在foo中使用x的定义
std::cout 1,使用条内x的定义(由条返回)
}
无关的: cout和cin不是函数,而是流对象的实例

编辑
正如Keine Lust建议的那样进行了修复查看它是信息性的[限定标识符

限定id表达式是由作用域解析运算符::和(可选)枚举序列(自C++11起)类或命名空间名称或decltype表达式(自C++11起)预先设置的非限定id表达式由作用域解析运算符分隔。例如,表达式std::string::npos是一个在命名空间std中的类字符串中命名静态成员npos的表达式。表达式::tolower在全局命名空间中命名函数tolower。表达式::std::cout在命名空间std中命名全局变量cout,后者是顶级表达式boost::signals2::connection命名在命名空间signals2中声明的类型连接,该类型连接在命名空间boost中声明


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

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

    #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;
    }
#包括
使用名称空间std;
int变量=20;
int main()
{
浮动变量=30;

cout是一个很好的问题,但有点太宽泛(IMO)。这叫做范围解析运算符,您进一步学习的搜索词是范围。所有这些名称(
cout
,A
的成员函数)都是在范围中定义的,您必须解析范围(也就是说,告诉编译器在哪里查找)使用
::
的前缀可以是命名空间或类。因为
main
既不是命名空间也不是类(它是函数),
main::printStuff
可能不正确。::给出所有权的概念。当定义是类或命名空间的一部分时,您应该使用::来访问它…不完全是这样,但这会给您一种感觉。
cout
cin
不是函数,它们是对象。链接它们也没有错:
myNamespace::myClass::myMember
::std::cout
。在
meh
中不应为
静态常量int x=2;
?感谢分享
    #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;
    }