我正在学习C ++,以便了解我给出的一些开源代码。
我遇到如下行:
cmd << '\n'
我认为“cmd”必须是流的某种特殊接受者,也许是一个字符串 - 但是在进一步研究中,我发现“cmd”是一个具有各种数据和功能的整个类。这让我很困惑。为什么代码看起来不像这样:
cmd.stringpart << '\n'
有人可以告诉我发生了什么,或者建议给我一篇文章来看看。
更正: cmd是类的实例,而不是类本身。
答案 0 :(得分:7)
在C ++中,您可以重载运算符。在这种情况下,似乎用于使某些Cmd类的行为类似于流。
答案 1 :(得分:4)
我首先检查一下cmd
是一个实例的类是否会覆盖<<
运算符 - 这将显示此代码中的内容。
答案 2 :(得分:4)
将运算符视为函数:例如,3 + 4
调用二进制函数,取两个数字并返回它们的总和。
在这里,作者创建了这样一个函数来定义&lt;&lt;运算符,以便它可以使用cmd类实例作为左参数,将字符串作为正确的参数。这称为“运算符重载”。在代码中查找运算符&lt;&lt; 出现次数。
这也可以是cmd类的成员函数,带一个参数(仍然命名为 operator&lt;&lt; )。
答案 3 :(得分:2)
检查此类中的运算符重载 - 您应该使用'&lt;&lt;'来寻找函数用它的名字。
答案 4 :(得分:2)
听起来像ostream运算符(&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;寻找一个名为“operator&lt;&lt;”的方法在类定义中。 C ++允许程序员“重载”或重新定义运算符(包括+, - ,*,/,+, - ,等)与其类一起工作的方式。有关此问题的讨论,请参阅任何C ++文本。
答案 5 :(得分:0)
在许多语言中,包括C ++ 你被允许做所谓的“操作员超载”
在你的代码中,如果你有一个例如你重复执行的操作,通常为了更清晰和更方便的代码,你可以选择一个现有的运算符(例如 - ,+ =,==,&lt;&lt; ,&gt;&gt;)并在本地重新定义,即覆盖,然后随意使用它。
在某些情况下,您可以覆盖运算符以在库中创建所需的功能。例如: - 您创建了一个主要用于存储信息块的类。然后,使用容器类(来自各种库)来存储类的实例。
Foo {
int a;
int b;
std::string c;
}
因此通常每个容器类都有方法来处理,删除,添加,比较(...)存储的实例。假设您要将Foo foo的实例与存储在容器中的woo = FooContainer [0]与“==”进行比较,某些库将要求您重新定义,因此无论如何都要覆盖“==”运算符,其中一些将承担。例如,只有当(foo.a == woo.a&amp;&amp; foo.b == woo.b&amp;&amp; foo.c == woo.c)为真时,它们才会返回true。
好吧,也许两个实例只有在它们的'c'相同时才能使用,那么你可以覆盖“==”。您通常会在构造函数下的Foo中执行此操作。它看起来与此类似:
bool operator==(const Foo &foo) const {return c == foo.c;}
底线:
希望有所帮助......