1. 能不能是非成员函数
可以,但是前提是,既然写成了非成员函数,
就意味着你不能对私有的成员变量进行访问
#include<iostream>
using namespace std;
class Stock {
public:
Stock(int b) : a(b) {}
int a;
};
Stock operator+(Stock& a, Stock& b) {
return Stock(a.a + b.a);
}
int main() {
Stock s1(1), s2(2);
Stock s3 = s1 + s2;
cout << s3.a << endl;
return 0;
}
2.友元函数
什么时候必须用友元函数呢,就是你重载的运算符左侧的操作符必须是其他类的对象,比如你要重载输入输出运算符,运算符的左侧必须是cin,cout,这时候如果还是写成成员函数,那么由于参数列表的第一个参数默认是调用对象,也就是this,这就看着很奇怪了
而且当你重载操作符的时候,通过友元函数可以颠倒操作数之间的顺序,不受左侧必须是自定义类型的限制
#include<iostream>
using namespace std;
class Stock {
private:
int a;
public:
Stock(int b) : a(b) {}
friend ostream& operator<<(ostream& out, Stock& a);
friend istream& operator>>(istream& in, Stock& a);
};
ostream& operator<<(ostream& out, Stock& a) {
out << a.a;
return out;
}
istream& operator>>(istream& in, Stock& a) {
in >> a.a;
return in;
}
int main() {
Stock s1(0);
cin >> s1;
cout << s1;
return 0;
}