重载运算符三个const的作用

const Point operator+(const Point &point) const{

}
尝试去理解const,然后搞懂为什么这里放置const。
const 用于修饰左边的东西(来自大佬的纠正),只有当其为最左边的修饰符时才会作用于右边的东西,使其为常量,不可被修改。参考链接
在这里插入图片描述
好了言归正传
1.第一个const 的位置后面是函数返回值类型,表明函数返回的是常量!
2.第二个const 的位置后面是函数参数,表明读取参数时,将其视为常量,保证当传参为const类型时也可接受,否则如果只是接受变量,那么就无法处理+常数的操作。
3.第三个const后面表面看没有东西,其实可以视为缺省了类自身,或者可以认为其修饰的是this指针。那么这里的意义是,使得调用operator+的这个对象可以是const类型。。
大佬的参考链接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
笔者运行了第三const的代码后:

#include<bits/stdc++.h>
using namespace std;
struct Point{
    int x,y;
    Point(int a,int b):x(a),y(b){};
    const Point operator+(const Point &tmp){
        return Point(x+tmp.x,y+tmp.y);
    }
};
int main(){
    //freopen("in.txt","r",stdin);
    const Point p1 = Point(10, 20);
    Point p2 = Point(20, 30);
    Point p3 = p1 + p2; // 不加第3个const,这里会报错,因为p1是常数
    // 注意,这里p1是常量,p2是变量,由于重载了“+”
    // 上一句代码等同于 p1.operator+(p2);
    // 由p1调用的operator+函数,因此调用该函数的是个常数。
    cout<<p3.x<<" "<<p3.y<<endl;
    return 0;
}

报错信息为:
在这里插入图片描述
这里可以看到,重载运算符函数不匹配“const Point”与“Point”的相加类型,因为如果不加第三个const时,调用此运算符的对象是变量,而在C++中 const object-> 变量是不允许的,因为一旦变为变量,那么就意味着可以修改这个对象的内容,也就违背了const的定义,故报错。
额外知识:C++中变量->const object是允许的,作用范围仅为当前函数内,所以传参时即便加了第二个const,传递变量类型也不会报错。
疑问:
1.如果加了第一个const是否会导致p3无法修改呢?不会,只是p1+p2的返回值是常量类型,但是还有个赋值=操作,赋值之后,p3还是变量。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以在矩形类中重载运算符*,实现矩形的乘法操作。我们可以定义一个三阶矩形类Rect3,包含三个长度为3的一维数组作为矩形的三行,实现如下: ```c++ class Rect3 { private: double data[3][3]; public: Rect3() {} Rect3(const double arr[3][3]) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { data[i][j] = arr[i][j]; } } } double* operator[](int row) { return data[row]; } Rect3 operator*(const Rect3& other) { Rect3 result; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { result[i][j] = 0; for (int k = 0; k < 3; k++) { result[i][j] += data[i][k] * other[k][j]; } } } return result; } void print() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { cout << data[i][j] << " "; } cout << endl; } } }; ``` 在上面的代码中,我们定义了一个Rect3类,包含两个重载运算符:[]和*。[]运算符用于获取矩形的某一行,*运算符用于实现两个矩形的相乘。在*运算符实现中,我们使用了三重循环,分别遍历两个矩形的行、列和中间的维度,实现矩形的乘法操作。最后,我们返回一个新的矩形,作为两个矩形相乘的结果。 下面是一个使用Rect3类的示例程序,演示了如何创建两个矩形并将它们相乘: ```c++ int main() { double arr1[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; double arr2[3][3] = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}}; Rect3 rect1(arr1); Rect3 rect2(arr2); Rect3 result = rect1 * rect2; result.print(); return 0; } ``` 运行上面的程序,输出结果如下: ``` 30 24 18 84 69 54 138 114 90 ``` 这是两个三阶矩形相乘的结果,符合矩阵乘法的定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值