C++中的<<运算符是什么?
What is the << operator for in C++?
我来自C#和Java的C++背景,我正在努力理解>>
&<<
操作员,如
std::cout << "Hello World";
这里我不能理解的是<<
运算符的作用。我试着声明我自己的简单函数,它总是返回整数5
,我可以像在C#、中那样调用它
int x = MyFunction();
这就把x
变成了5
,但为什么我需要把std::cout
和<<
一起使用呢?如果你能帮助我理解>>
和<<
的作用,我将不胜感激。
感谢你们帮助我理解这一点。真正让我大开眼界的是,std::cout是和object:)
你没有准确地拼写出来,但我相信你的困惑是你认为std::cout
是一个函数,你想知道为什么不这样调用它:
std::cout("Hello World");
std::cout
不是一个函数。该语句中的函数为operator<<
。
std::cout << "Hello World";
或者,更具体地说,函数是std::ostream::operator<<(const char*)
。
您需要理解的是,运算符只是具有替代调用语法的函数。operator<<
被重载为std::ostream
的成员函数,而std::cout
是std::ostream
的对象。所以这个:
std::cout << "Hello World";
是另一种称之为的方法吗
std::cout.operator<<("Hello World");
请注意,operator<<
是一个二进制运算符,这意味着如果它被声明为自由函数,它需要两个参数,如果它被宣布为成员函数,则需要一个参数。使用替代调用语法时,左侧的对象是第一个参数,右侧的对象是第二个参数。在它被声明为成员函数的情况下,就像在本例中一样,左边的对象是调用对象,右边的对象是参数。
如果它被声明为自由函数,它会是什么样子:
operator<<(std::cout, "Hello World");
但是,无论它是被声明为成员还是自由函数,您仍然可以使用相同的替代调用语法。
<<
是左移位运算符,>>
是右移位运算符,就像它们在Java和C#中一样。
然而,此外,<<
被过载,以提供一种向流输出值的方式。流std::cout
通常指的是程序启动的终端,用<<
向该流写入一些内容将其写入终端。类似地,>>
被过载以从流中读取,并且在从终端读取流std::cin
的情况下,程序在上启动
这类事情在C++中有效,因为您为用户定义的类型定义了运算符的行为。在java中,运算符只对内置类型进行操作——如果a
和b
是您自己类的实例,则写入a + b
是错误的。在C++中,如果类定义了一个合适的运算符+
,则允许这样做。
在I/O流的情况下,<<
和>>
运算符被重载以表示除位移位之外的其他内容。例如,std::ostream::operator<lt;对于许多类型都是重载的,您也可以为自己的类型添加重载。例如:
#include <string>
#include <iostream>
class my_type {
public:
my_type(const std::string &name) : _name(name) { }
const std::string &get_name() const { return _name; }
private:
std::string _name;
};
std::ostream& operator<< (std::ostream& out, const my_type &foo ) {
return out << foo.get_name();
}
int main() {
my_type m("foo");
std::cout << m; // prints "foo"
return 0;
}
据我所知,c++有流
<lt;是一个运算符,它是一个用于将数据"附加到流中"的运算符
And>>用于从流中提取数据
当然,您可以用不仅仅是流的类来实现这一点
通常,<<
和>>
运算符具有相同的含义。然而,在您给定的情况下,它们分别是流写入和读取运算符。具体来说,<<
是写运算符(可以认为它指向流),>>
是读运算符(指向远离流)。
它们是通过重载<<
和>>
运算符来处理的。特别地,C++范式是分别为ostream
s和istream
s添加<<
和>>
的重载,以处理输入和输出。C++没有像Java和C#那样内置ToString()
的范例
最后,std::cout
、std::cin
和std::cerr
分别是ostream
、istream
和ostream
的实例,这就是它们获得<<
和>>
过载的原因。
例如,以下代码将Hello World
输出到标准输出流。
std::cout << "Hello World" << std::endl;
最后,std::endl是一个特殊的ostream
,它添加了一个换行符并刷新流。
在C和C++中,<lt;操作员的意思是"左移"。在C++中,当使用标准模板库时,<lt;和>>运算符被重载以实现流式API。
对象std::cout确实重载了<lt;运算符将其用作转换函数(在本例中为打印到控制台的字符串)。
实际上这个:
int x = myFunction();
std::cout << x;
这个:
std::cout << myFunction();
在功能上是相同的(除了临时变量x的定义之外)。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么