以非成员函数方式重载运算符
/*** overtwo.cpp ***/ #include<iostream> using namespace std;class Box {public:Box(double l = 2.0,double b = 2.0,double h = 2.0){length = l;breadth = b;height = h;}double getVolume(){return length*breadth*height;}private:double length;double breadth;double height;friend Box operator+(const Box& a,const Box& b); };Box operator+(const Box& a,const Box& b) {Box box;box.length = a.length+b.length;box.breadth = a.breadth+b.breadth;box.height = a.height + b.height;return box; }int main() {Box box1(3.3,1.2,1.5);Box box2(8.5,6.0,2.0);Box box3;double volume = 0.0;volume = box1.getVolume();cout << "Volume of box1 : " << volume << endl;volume = box2.getVolume();cout << "Volume of box2 : " << volume << endl;box3 = box1 + box2;volume = box3.getVolume();cout << "Volume of box3 : " << volume << endl;return 0; }
运算结果:
exbot@ubuntu:~/wangqinghe/C++/20190808$ g++ overtwo.cpp -o overtwo
exbot@ubuntu:~/wangqinghe/C++/20190808$ ./overtwo
Volume of box1 : 5.94
Volume of box2 : 102
Volume of box3 : 297.36
当两个对象相加时是没有顺序要求的,但是要重载+让其与一个数字相加有顺序要求,可以通过加一个友元函数使另一个顺序的输出合法。
/*** overfriend.cpp ***/ #include<iostream> using namespace std;class A {private:int a;public:A();A(int n);A operator+(const A &obj);A operator+(const int b);friend A operator+(const int b,A obj);void display(); };A::A() {a = 0; }A::A(int n) {a = n; }A A::operator +(const A& obj) //重载+号,用于对象相加 {return this->a+obj.a; }A A::operator+(const int b) //对象和数相加 {return A(a+b); }A operator+ (const int b, A obj) // 友元函数调用第二个重载+的成员函数,相当于obj.operator(b) {return obj+b; }void A::display() {cout << a << endl; }int main() {A a1(1);A a2(2);A a3,a4,a5;a1.display();a2.display();int m = 1;a3 = a1 + a2; //可以调换顺序,相当于a3=a1.operator+(a2); a3.display();a4 = a1 + m; //加了一个友元函数可调换顺序 a4.display();a5 = m + a1;a5.display();return 0; }
运算结果:
exbot@ubuntu:~/wangqinghe/C++/20190808$ ./overfrined
1
2
3
2
2