2015-11-05 54 views
0

一个非常基本的问题,但我一直在这个难题。为什么在std :: cout中使用“::”运算符而不是“。”运营商?

为什么我们究竟写

int main(){ 
    std::cout << "HelloWorld!"; 
} 

而不是

int main(){ 
    std.cout("HelloWorld!"); 
} 

据我所知,::运算符用于在类编辑功能,但为什么会在这种情况下用来调用std类中的一个函数,而不是。运营商?

+6

'std'不是类。它是名字空间。 –

+0

'.'仅在左侧有*值*的情况下使用。它意味着从该值的类中选择一个成员。 '.'和'::'是C++语言的“allophones” - 没有任何情况他们都是正确的,并且会有不同的含义。但它有助于可读性,因为如果你看到'.',那么你就知道你正在使用一个对象。 –

回答

4

::运算符是范围解析运算符。前缀可以是一个名称空间或一个类。

.运算符用于选择对象的成员。前缀是结构,联合体或类类型的表达式(并且通常是该类型的对象的名称)。

std是一个命名空间,而不是一个类。即使它是一个类,std::cout仍然是正确的,如果cout是该类的静态成员。 std.cout只有当std对象时才是正确的,该对象具有名为cout的成员类型。

C++ 可以已经被定义为使用.对于所有这些情况,但使用的::为范围解析运营商和.为成员选择运算符可以使代码更易于阅读,因为它是更加明确。 (还有其他两种语言都使用.。)

+0

这样做很有意义,谢谢! –

2

因为std不是一个对象,但一个命名空间和scope resolution operator::用于指定的上下文或范围的使用来解决的标识符,其中在C++中可以是一个类或一个命名空间。 .运算符是成员访问运算符,用于访问对象的成员而不是类或名称空间范围内的名称。

所以std::cout意思是“名称cout在命名空间std”,而例如是std::ios_base::binary在命名空间stdfoo.x在类ios_base的范围定义的常数被命名为名为foo对象的x成员变量。

+1

那么'''用于访问命名空间中的成员'''用于访问类中的成员? –

+1

这是不正确的。 '::'用于类和名称空间。 –

+0

@ M.M一个类可以是范围解析运算符上下文中的'名称空间'。例如,一个嵌套的类定义存在于其封闭类的名称空间中。 – mattnewport