C++中的多重插入运算符<<

Posted

技术标签:

【中文标题】C++中的多重插入运算符<<【英文标题】:Multiple insertion operator << in C++ 【发布时间】:2014-11-18 04:50:05 【问题描述】:

我编写了一个小代码来看看如果我使用系列插入运算符来拥有类会发生什么。

#include <iostream>
using namespace std;


class MyClass

    public:
        int i;
        MyClass & operator<< ( const string &  );

 ;

MyClass& MyClass::operator<< ( const string &  )

    cout << this << endl ;


int main()

    MyClass mc;

    mc << "hello" << "world" ;


它给出了两个不同内存地址的结果,这超出了我的想象。

0x7fffdc69f6df
0x6020a0

我虽然应该是这样的:

(( mc << "hello" ) << "world" );

但实际上,这似乎是操作之间的“临时” MyClass。这会导致成员变量(例如,类中的int i)会不一致。如果我希望成员变量 (int i) 可以持续访问,任何人都可以向 cmets 提供此信息。

【问题讨论】:

这段代码还能编译吗?运算符函数不返回值。 看起来你对mc &lt;&lt; "hello" &lt;&lt; "world" ; 的实际作用有一些严重的误解。您的问题毫无意义,一切都按预期进行。 你好,马蒂!代码可以编译。我可能不太了解运算符重载的概念。这就是我尝试编写小代码来弄清楚的原因。当我将 i++ 添加到实现 MyClass& MyClass::operator @Chiat-ChhànÂng 查看我的回答。 Clarify your question! 【参考方案1】:

你可能打算写一些如下代码

#include <iostream>
using namespace std;

class MyClass 
    public:
        int i;
        MyClass & operator<< ( const string &  );
 ;

MyClass& MyClass::operator<< ( const string & str)  // Note the parameter symbol
    cout << str << endl ; // Note usage of the parameter symbol "str", "this" is not 
                          // what you actually want here, it just outputs the address 
                          // of the class instance
    return *this; // Return the instance reference properly to allow chaining of
                  // subsequent operator<<() calls


int main() 
    MyClass mc;

    mc << "hello" << "world" ;

输出

hello
world

见LIVE DEMO


让我们分解一下:

 mc << "hello" << "world";

其实和调用是一样的

 mc << "hello";
 mc << "world";

返回实例引用将启用在应用的运算符调用中调用的函数。


“但实际上,操作之间似乎是一个“临时的”MyClass。”

出现问题是您缺少使用return *this; 语句返回当前实例。因此,访问预期的返回值会导致operator&lt;&lt;() 的第二次调用的未定义行为。 编译器至少应该针对缺少的return 语句发出警告。

【讨论】:

以上是关于C++中的多重插入运算符<<的主要内容,如果未能解决你的问题,请参考以下文章

C++模板函数定义中的“&”运算符

C++ STL与迭代器

什么是 C++ 中的“<?=”运算符? [复制]

如何让C++中的代码规范一点

C++ 运算符重载

C++的探索路12继承与派生之高级篇--派生类与赋值运算符及多重继承