C++中的<<运算符是做什么用的?

6
在下面的示例中,<<运算符到底是做什么的?我猜它不是一个位运算符。
std::cout << "Mouse down @ " << event.getPos() << std::endl;

我理解这段代码的作用:使用标准输出,发送这段文本,然后发送一个换行符。但是,我从来没有遇到过除了在原始二进制文件中使用<<之外的用法。

我刚开始学习C++。作为一种运算符,很难搜索到它的描述和含义。有人能给我指点一下该如何搜索吗?

谢谢 罗斯


你错了,因为它不会替换掉 @ 符号。 - Puppy
6个回答

12
答案是:对于整数类型,默认情况下,运算符“<<”执行左移操作,但可以重载为任何你想要的操作!
将字符串输入流中的语法首次(我认为)演示在C++发明者Bjarne Stroustroup的同名书籍The C++ Programming Language中。个人认为,重新定义运算符以进行IO操作是一种花哨的技巧;它可以产生很酷的演示代码,但并没有为使代码更易懂做出贡献。编程语言社区广泛批评了运算符重载技术。

编辑: 由于没有其他人提到这一点:

operator<< 定义在 ostream 类中,其中 cout 是一个实例。该类定义位于 iostream 库 中,该库通过 #include 被包含为 <iostream>


实际上,如果你想要严谨一点的话,“operator<<”是一个带有“ostream”作为第一个参数的自由函数。 - Billy ONeal
我认为不应该使用运算符重载,因为类方法可以实现相同的功能。在ostream的情况下,可以通过具有可链接性的write_formatted方法来实现operator<<的功能。 - Siqi Lin
@异常:感谢您的意见。不幸的是,当有人尝试执行类似于“myOstream << myClass”的操作时,您所寻找的东西会出现问题。通过添加额外的方法,可以添加operator<<;但是不能将方法直接添加到标准库类中。 - Billy ONeal
@Carl:实际上,我们两个都是对的——几个基本类型的operator<<都是成员函数。但是const char *的重载是自由函数。此外,任何被移出的用户定义类都将以自由函数的形式编写。 - Billy ONeal
1
“运算符重载作为一种技术在编程语言社区中受到了广泛的批评。”尽管我看到的关于C++运算符重载的最大直接批评是随着Java的设计而来的,它本身(C++的粉丝可能会争辩说)使用了运算符重载,例如在字符串加法中。它只是不允许普通程序员重载运算符-这个权利是保留给语言设计者的;-)(实际上,C++运算符重载的最大直接批评可能是平均程序员对其使用的批评...)” - Steve Jessop
显示剩余3条评论

3

像c++中的其他运算符一样,<<执行操作。 通过重载,使用一个ostream左操作数(std::cout是ostream类型),它被用作流运算符来打印各种类型的数据。 例如,你可以这样做:

int x = 10;
std::string y = " something";
std::cout << x << y << std::endl;

这将输出“10 something”。
在这种情况下,“@”没有被任何东西替换。operator<<只是转储结果。
std::endl不仅是行的结尾,它还将结果刷新到输出设备。

3

3
有时称为“流插入运算符”,最常见的用途是将数据插入到流中。但有时会重载此运算符,以在进行序列化等操作时将数据插入其他对象中。

1
尝试编写一个程序,在该程序中创建一个对象并调用重载的<<运算符。
class x {
    //declare some pvt variables
    //overload << operator
};

int main() {
    x obj;
    cout << obj;
}

通过这样做,您将理解使用以下语句的基本原理。
cout << string_var << int_var;

尽管不是真实的,但您可以将'string'和'int'视为已重载<<运算符的类。


-4
这是一个"按位左移"运算符。

n << p

将n的位向左移动p个位置。零位被移入低位位置。3 << 2 等于12。

在问题的上下文中,它将某些东西推入到名为'cout'的当前输出流中。


@Nick Brooks:我修改了你的最后一行,使其更加清晰,但可能为时已晚,无法挽救你的回答遭受的厌恶。 - Carl Smotricz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接