当自定义类型需要进行运算的时候必须讲运算符进行重载。运算符重载使得编译器给所有的类起了一个通用的运算符名称即operator和运算符组合的形式,这样不同类在重载运算符的时候就有一个通用的名字了。

加号运算符重载
类和基本内置类型相加的实现:
这种情况可以使用全局函数重载和成员函数重载
1 class Person { 2 public: 3 Person operator+(int num) { 4 Person temp; 5 temp.a_ = this->a_ + num; 6 temp.b_ = this->b_ + num; 7 return temp; 8 } 9 int a_; 10 int b_; 11 }; 12 void test01() { 13 Person p1; 14 p1.a_ = 10; 15 p1.b_ = 10; 16 17 Person p3 = p1 + 10; 18 cout << p3.a_ << endl; 19 }
输出结果是20
左移运算符的重载:
这个时候只能使用全局函数重载,因为我们想要cout在输出对象的前面,总的来说成员函数重载和成员函数的重载的不同之处在于,成员函数重载你不能控制它的顺序比如cout你必须在对象的左侧,而全局函数的重载可以控制顺序,即第一个参数在第二个参数的左侧。
1 class Person { 2 friend std::ostream& operator<<(std::ostream& cout, Person& p); 3 public: 4 Person(int a, int b) :a_(a), b_(b) { 5 6 } 7 private: 8 int a_; 9 int b_; 10 }; 11 std::ostream& operator<<(std::ostream& cout, Person& p) { 12 cout << p.a_ << endl; 13 return cout; 14 } 15 void test01() { 16 Person p(10,20); 17 cout << p << endl; 18 }
前置和后置递增运算符(递减也一样的)
1 Myinteger& operator++() { 2 ++num_; 3 return *this; 4 }//前置 5 Myinteger operator++(int) { 6 Myinteger ret = *this; 7 ++num_; 8 return ret; 9 }//后置
下面进行几点说明:
- 后置运算符为什么不返回引用,因为ret是局部对象,不能返回局部对象的引用
- 从这个地方可以看出来为什么前置是左值,而后置是右值;因为前置返回的是一个引用,引用是左值。而后置在函数执行return语句的时候函数会创建一个临时量,这个临时变量会接收ret的值,因为是临时量所以它是右值。从内置类型的角度来看左值和右值:

这里面后置报错的原因就是因为a加加之后是一个右值而右值不可以修改,而前置加加后是一个左值,左值可以更改。