C++ 扩展了对运算符的重载,允许自定义特殊的运算符函数,这种函数描述了特定的运算符与类之间的关系。运算符函数可以是类成员函数,也可以是友元函数,对于某个运算符op,其运算函数的格式如下:
operator op(argument-list)
argument-list 表示改运算符的操作数。如果运算符函数是类成员函数,则第一个操作数是调用对象,它不在argumen-list中。假设有一个Vector类,其头文件如下
class MyVec {
private:
double x,y;
public:
// 构造函数
MyVec();
MyVec(double x_, double y_);
~MyVec();
// 重载的运算符函数,为MyVec类的成员函数
MyVec operator+(const MyVec & v) const;
MyVec operator-(const MyVec & v) const;
MyVec operator-() const;
MyVec operator*(double n) const;
// 利用友元函数重载的运算符函数,为非成员函数
friend MyVec operator*(double n, const MyVec & v);
friend std::ostream & operator<<(std::ostream & os, const MyVec & v);
};
如果vec1,vec2和vec3都是MyVec对象,则可以用下面的语句来调用运算符函数
vec3 = vec1.operator+(vec2);
vec3 = vec1 + vec2;
vec3 = vec1 - vec2;
vec3 = -vec1;// 求负
vec3 = vec1 * 2.0;// 调用重载的运算符成员函数
vec3 = 2.0 * vec1;// 调用重载的友元运算符函数
cout << vec3 ;
在使用加法和减法法操作时vec1 op vec2
回被转换成vec1.operator op(vec2)
执行,此时第一操作符为MyVec
对象,当第一操作符不是MyVec对象时,列如:vec3 = 2.0*vec1
时,由于没有在double
中重载operator*(MyVec)
,所以无法通过编译器,这种时候就需要使用友元函数了,友元函数是一种非成员变量,但是它可以使用类的私有属性。友元函数例如friend MyVec operator*(double n, const MyVec & v)
, friend
为友元函数的关键字,当vec3 = 2.0*vec1
执行时就会调用改友元函数了。同样在重载<<
操作符时,第一操作符为ostream
,故需要使用友元函数。
为了在使用<<
操作符时能够实现cout << "a" << vec1 << endl
的效果,让重载的运算符函数,返回ostream
的引用,即cout << vec1
返回的仍然时cout
对象,故可以连续使用<<
运算符。MyVec类的具体实现如下:
MyVec::MyVec() {
x = y =0;
}
MyVec::MyVec(double x_, double y_){
x = x_;
y = y_;
}
MyVec::~MyVec() = default;
MyVec MyVec::operator+(const MyVec & v) const{
return MyVec(x + v.x, y + v.y);
}
MyVec MyVec::operator-(const MyVec &v) const {
return MyVec(x - v.x, y - v.y);
}
MyVec MyVec::operator-() const {
return MyVec(-x,-y);
}
MyVec MyVec::operator*(double n) const {
return MyVec(x * n, y * n);
}
MyVec operator*(double n, const MyVec &v) {
return v*n;
}
std::ostream & operator<<(std::ostream &os, const MyVec &v) {
os << "(x,y) = (" << v.x << "," << v.y << ")";
return os;
}
测试代码如下
int main(){
using std::cout;
MyVec vec;
MyVec vec1(5.0,4.0);
MyVec vec2(3.0, 4.0);
cout << "vec1 = " << vec1 << "\n";
MyVec sum = vec1 + vec2;
cout << "(vec1 + vec2) = " << sum << "\n";
cout << "(vec1 - vec2) = " << vec1 - vec2 << "\n";
cout << "(-vec2) = " << -vec2 << "\n";
double n = 2.0;
cout << "(vec1 * 2.0) = " << vec1 * n << "\n";
cout << "(2.0 * vec2) = " << n * vec2 << "\n";
return 0;
}
最后的输出为: