重载ostream和istream运算符的时候,必须重载为友元,这是为什么?
什么时候应该用友元函数?什么时候用成员函数?
有些操作必须是成员函数:比如构造函数,拷贝构造函数,析构函数以及虚函数
由于成员是局部于类的,所以,这些函数还是优先被作为成员。
由此可见,修改一个类对象状态的操作,应该或者是一个成员,或者是一个带有非
const引用参数的全局函数。那些要求基础类型的左值运算符作为用户定义类型的成员函
数最为自然。
如果希望某个运算的所有运算对象都能允许隐式类型转换,实现他的函数就应该作为
非成员函数,取const引用参数或非引用参数。在应用不需要基础类型的左值的运算符(+,
-||等),显示它们的函数通常采用这种方式。这些运算符经常需要访问其运算对象类的内部
表示,因此,它们friend函数的最常见的来源。
如果没有定义类型转换,选择成员函数要比采用引用参数的友元函数更好
PS:如果重载为成员函数,编译时就会产生以下错误:
error C2679: 二进制“<<”: 没有找到接受“MyString”类型的右操作数的运算符(或没有可接受的转换)