C++运算符重载

C++运算符重载

关于重载自增自减运算符的一些深入讨论:

参考

通常我们重载前置++运算符的返回值类型是 Obj &,而后置++运算符的返回值类型是 Obj,这是因为运算符重载最好保持原运算符的用法。C++ 固有的前置++运算符的返回值本来就是操作数的引用,而后置++运算符的返回值则是操作数值修改前的复制品。

例如:

C++
int a = 5;(++a) = 2;

上面两条语句执行后,a 的值是 2,因为 ++a 的返回值是 a 的引用。而

C++
(a++) = 2;

这条语句是非法的,因为 a++ 的返回值不是引用,不能作为左值。

换句话说,前置++返回左值,后置++返回右值。

当然,如果我们还重载了对象的加减等运算符,希望自增自减参与对象的这些运算,返回的应当是对象(这也是推荐的做法),如果希望得到自增自减的“数值”,可以返回int

但如果重载后置运算符时返回的是引用,有可能破坏类的封装性。如下:

c++
#include<iostream>
using namespace std;
class Sample{
    int n;
public:
    Sample():n(0){}
    explicit Sample(int m){n=m;};
    int& operator--(int){
        n--;
        return n;
    }
    void disp(){
        cout<<n<<endl;
    }
};
int main(){
    Sample s(10);
    (s--)++;
    s.disp();
    return 0;
}

(s--)直接返回内部私有变量n的引用,则外部的++可越过限制改变其值。

继承和多态

image-20230421161915507
image-20230421161949156

C++运算符重载
http://lunaticsky-tql.github.io/posts/53807/
作者
Lunatic sky
发布于
2022年12月21日
许可协议