一个非常基本的问题,但我一直在这个难题。为什么在std :: cout中使用“::”运算符而不是“。”运营商?
为什么我们究竟写
int main(){
std::cout << "HelloWorld!";
}
而不是
int main(){
std.cout("HelloWorld!");
}
据我所知,::运算符用于在类编辑功能,但为什么会在这种情况下用来调用std类中的一个函数,而不是。运营商?
一个非常基本的问题,但我一直在这个难题。为什么在std :: cout中使用“::”运算符而不是“。”运营商?
为什么我们究竟写
int main(){
std::cout << "HelloWorld!";
}
而不是
int main(){
std.cout("HelloWorld!");
}
据我所知,::运算符用于在类编辑功能,但为什么会在这种情况下用来调用std类中的一个函数,而不是。运营商?
::
运算符是范围解析运算符。前缀可以是一个名称空间或一个类。
.
运算符用于选择对象的成员。前缀是结构,联合体或类类型的表达式(并且通常是该类型的对象的名称)。
std
是一个命名空间,而不是一个类。即使它是一个类,std::cout
仍然是正确的,如果cout
是该类的静态成员。 std.cout
只有当std
是对象时才是正确的,该对象具有名为cout
的成员类型。
C++ 可以已经被定义为使用.
对于所有这些情况,但使用的::
为范围解析运营商和.
为成员选择运算符可以使代码更易于阅读,因为它是更加明确。 (还有其他两种语言都使用.
。)
这样做很有意义,谢谢! –
因为std
不是一个对象,但一个命名空间和scope resolution operator::
用于指定的上下文或范围的使用来解决的标识符,其中在C++中可以是一个类或一个命名空间。 .
运算符是成员访问运算符,用于访问对象的成员而不是类或名称空间范围内的名称。
所以std::cout
意思是“名称cout
在命名空间std
”,而例如是std::ios_base::binary
在命名空间std
和foo.x
在类ios_base
的范围定义的常数被命名为名为foo
对象的x
成员变量。
那么'''用于访问命名空间中的成员'''用于访问类中的成员? –
这是不正确的。 '::'用于类和名称空间。 –
@ M.M一个类可以是范围解析运算符上下文中的'名称空间'。例如,一个嵌套的类定义存在于其封闭类的名称空间中。 – mattnewport
'std'不是类。它是名字空间。 –
'.'仅在左侧有*值*的情况下使用。它意味着从该值的类中选择一个成员。 '.'和'::'是C++语言的“allophones” - 没有任何情况他们都是正确的,并且会有不同的含义。但它有助于可读性,因为如果你看到'.',那么你就知道你正在使用一个对象。 –