码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 重写[]运算符

时间:2020-05-30 10:35:55      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:报错   引用   不能   左值   ace   turn   src   结果   c中   

数组下标运算符[]通常用于访问、修改一个对象中的数据域或者元素。而现在,我们希望它的功能是:访问有理数(C++ 有理数类)的分子和分母。

首先我们在Rational.h文件的public中添加:

int operator[](int index);

然后在Rational.cpp文件中实现函数:

int Rational::operator[](int index) {
    //若为0,则返回分子;否则,返回分母
    if (index == 0) {
        return this->numerator;
    } else {
        return this->denominator;
    }
}

我们测试一下结果:

#include <iostream>
#include "Rational.h"

using namespace std;

int main()
{
    Rational r1(4, 2);
    Rational r2(2, 3);

    cout << r1[0] << "/" << r1[1] << endl;
    cout << r2[0] << "/" << r2[1] << endl;

    return 0;
}

技术图片

 可以看到,我们重载的运算符实现了正常的功能。

 

但我们想要像修改数组元素一样修改分子或分母,是否可行呢?

假如我么想要把r1的分子修改成3,分母修改成2。测试一下:

r1[0] = 3;
r1[1] = 2;

发现编译器报错了。大概意思是运算符不能在左值的一边。

技术图片

为什么呢?

这是因为我们要修改的值的地址,和分子或分母的地址不同。那么怎么样实现赋值操作呢?

这就用到了我们之前说到的引用返回(C++ 引用返回

也就是说,为函数签名

int Rational::operator[](int index)

加上符号“&”,变为

int& Rational::operator[](int index)

就可以了。

我们来测试一下:

#include <iostream>
#include "Rational.h"

using namespace std;

int main()
{
    Rational r1(4, 2);
    Rational r2(2, 3);

    r1[0] = 3;
    r1[1] = 2;

    cout << r1[0] << "/" << r1[1] << endl;
    cout << r2[0] << "/" << r2[1] << endl;

    return 0;
}

技术图片

C++ 重写[]运算符

标签:报错   引用   不能   左值   ace   turn   src   结果   c中   

原文地址:https://www.cnblogs.com/bwjblogs/p/12989556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!