运算符重载

发布时间 2023-06-03 17:46:23作者: 小凉拖

当自定义类型需要进行运算的时候必须讲运算符进行重载。运算符重载使得编译器给所有的类起了一个通用的运算符名称即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加加之后是一个右值而右值不可以修改,而前置加加后是一个左值,左值可以更改。