數組下標運算符[]通常用於訪問、修改一個對象中的數據域或者元素。而現在,我們希望它的功能是:訪問有理數(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; }