为什么在 std::cout 中使用 "::" 运算符而不是"."运算符?
Why is the "::" operator used in std::cout rather than the "." operator?
这是一个非常基本的问题,但我已经被这个问题难住了一段时间。
我们为什么要写
int main(){
std::cout << "HelloWorld!";
}
代替
int main(){
std.cout("HelloWorld!");
}
我知道::运算符用于编辑类中的函数,但为什么在这种情况下使用它来调用std类中的一个函数,而不是。操作人员
::
运算符是范围解析运算符。前缀可以是命名空间,也可以是类。
.
运算符用于选择对象的成员。前缀是结构、并集或类类型的表达式(通常是该类型对象的名称)。
std
是一个命名空间,而不是一个类。即使它是一个类,如果cout
是该类的静态成员,那么std::cout
仍然是正确的。只有当std
是具有名为cout
的成员的类型的对象时,std.cout
才是正确的。
C++本可以定义为在所有这些情况下使用.
,但使用::
作为范围解析运算符和.
作为成员选择运算符可以使代码更容易阅读,因为它更明确。(还有其他语言同时使用.
。)
因为std
不是对象,而是命名空间,并且作用域解析运算符::
用于指定用于解析标识符的上下文或作用域,在C++中,标识符可以是类或命名空间。.
运算符是一个成员访问运算符,用于访问对象的成员,而不是类或命名空间范围中的名称。
因此std::cout
的意思是"名称空间std
中的名称cout
",而例如std::ios_base::binary
是在名称空间std
中的类ios_base
的范围中定义的常数,并且foo.x
是名为foo
的对象的名为x
的成员变量。
相关文章:
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 关于 std::min, std::max 中的比较运算符的混淆
- C++:无法使用 "=" 运算符更改 std::p air 的值
- 为 std::variant 提供一个运算符 ==
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- C++矩阵类运算符使用 std::common_type_t 和复数的实现
- 错误:为"运算符 std::string {aka std::__cxx11::basic_string}"指定的返回类型<char>
- 运算符/ STD :: Chrono ::持续时间和自定义类型与Clang
- ostream 和运算符 std::basic_string<char, std::char_traits<char>, std::分配器<char>>?
- 为什么显式运算符 std::string 不起作用
- 运算符< std::set 的重载
- 运算符< std::map 的 int 类型比较的重载?(我希望它按降序排序。
- 运算符=(std::p romise&&) 在 C++11 中的结果是什么?
- 绑定运算符=std::string的成员
- 传递 const std::auto_ptr<> 作为 std::auto_ptr<_Tp>::运算符 std::auto_ptr_ref<_Tp1>() 的参数丢
- 运算符<< std::stringstream 派生类的重载(只是)
- 重载运算符 std::ostream& 运算符<<打印实例内存地址