为什么operator << 运算符重载,需要定义为friend函数呢?

来源:互联网 发布:石应康为何自杀 知乎 编辑:程序博客网 时间:2024/05/17 02:18

《C++ Primer》中这样说的:

与iostream标准库兼容的输入,输出运算符必须是普通的 非成员函数,而不能为类的成员函数,否侧他们的左侧对象将是我们的类的一个对象。

data << cout;  //如果operator <<是类的成员函数。


我读了好几遍才理解的,这样理解就行了,<<是 双目运算符,如果是类的成员函数那么<<的左侧应该是类本身,例如operator=

        /* 重载=输出运算符 */MyString& operator=(const MyString& s){delete []m_data;m_data = new char[strlen(s.m_data) + 1];memcpy(m_data,s.m_data,strlen(s.m_data) + 1);return *this;}
使用的时候就这样用的,左侧是str2,是类的对象。

        MyString str1("hello");MyString str2("ss");str2 = str1;

而operator<<使用的时候,是cout << str1;这样用的.左侧是cout,而不是类的对象,所以operator<<不能是类的成员函数,需要定义为友元函数。

        /* 重载<<运算符 */friend ostream& operator << (ostream& output, const  MyString &s){cout << s.m_data;return output;}




1 0
原创粉丝点击