运算符重载,什么时候用友元?

重载ostream和istream运算符的时候,必须重载为友元,这是为什么?

// over load input and output operators <<,>> friend ostream& operator<<(ostream &output, MyString &str); friend istream& operator>>(istream &input, MyString &str);

 

什么时候应该用友元函数?什么时候用成员函数?

 

有些操作必须是成员函数:比如构造函数,拷贝构造函数,析构函数以及虚函数

由于成员是局部于类的,所以,这些函数还是优先被作为成员。

 

 class X { // X(int); int m1(); int m2() const; friend int f1(X&); friend int f2(const X&); friend int f3(X); }; // 成员函数只能通过对象调用,不会使用用户定义的转换,例如 void g() { 99.m1(); // error 99.m2(); // error } // 全局函数f1()具有类似的性质,因为饮食转换不会被用于非const // 的引用参数,对于f2(),f3()的参数就可以实施转换 void h() { f1(99); // error f2(99); // ok:f2(X(99)) 隐式转换 f3(99); // ok:f2(X(99)) 隐式转换 }

 

由此可见,修改一个类对象状态的操作,应该或者是一个成员,或者是一个带有非

const引用参数的全局函数。那些要求基础类型的左值运算符作为用户定义类型的成员函

数最为自然。

 

 

如果希望某个运算的所有运算对象都能允许隐式类型转换,实现他的函数就应该作为

非成员函数,取const引用参数或非引用参数。在应用不需要基础类型的左值的运算符(+,

-||等),显示它们的函数通常采用这种方式。这些运算符经常需要访问其运算对象类的内部

表示,因此,它们friend函数的最常见的来源。

      如果没有定义类型转换,选择成员函数要比采用引用参数的友元函数更好

 

PS:如果重载为成员函数,编译时就会产生以下错误:

// operator<< ostream& MyString::operator<<(ostream &output) { // output<C_Str(); return output; } // operator>> istream& MyString::operator>>(istream &input) { // if (str.size()==0) // { // return input; // } // input>>str.m_cStr; input>>this->m_cStr; return input; }

 error C2679: 二进制“<<”: 没有找到接受“MyString”类型的右操作数的运算符(或没有可接受的转换)

你可能感兴趣的:(从零开始)