解释下标操作符为什么要返回引用
2012-02-17 17:24
323 查看
重载下标操作符的一大好处便是对对象内部的容器可以像访问数组元素一样进行读写。
这时候便会发现利用下标操作符只能读取data的i50号元素,但不可以修改,即不可以写。
f[50]相当于调用了成员函数f.operator[](50),由于不是返回引用,那么函数在返回的地方会创建一个临时整形变量,并用f.data[50]进行初始化,所以即使可以赋值,也仅仅是对临时对象进行赋值。但如果该函数返回的是引用的话,那么函数调用结束后并不会创建临时变量保存运算结果,而是直接把f.data[50]放在调用结束处,因此是可以改写对象的内部状态的。这便是返回引用的好处。
如果重载的下标操作符不返回引用,便只能读取对象的内部状态。
#include <vector> using std::vector; #include <iostream> using std::cout; using std::endl; class Foo { public: Foo(): data(100) { for (int i = 0; i != 100; ++i) data[i] = i; } int operator[](const size_t); //const int operator[](const size_t) const; // other interface members private: vector<int> data; // other member data and private utility functions }; int Foo::operator[](const size_t index) { return data[index]; // no range checking on index } int main() { Foo f; cout << f[50] << endl; //相当于cout << f.operator[](50) << endl; f[50] = 90; //相当于f.operator[](50) = 90; cout << f[50] << endl; system("pause"); return 0; }
这时候便会发现利用下标操作符只能读取data的i50号元素,但不可以修改,即不可以写。
f[50]相当于调用了成员函数f.operator[](50),由于不是返回引用,那么函数在返回的地方会创建一个临时整形变量,并用f.data[50]进行初始化,所以即使可以赋值,也仅仅是对临时对象进行赋值。但如果该函数返回的是引用的话,那么函数调用结束后并不会创建临时变量保存运算结果,而是直接把f.data[50]放在调用结束处,因此是可以改写对象的内部状态的。这便是返回引用的好处。
相关文章推荐
- C++中赋值操作符为什么要返回引用类型
- 为什么operator=操作符返回引用
- 为什么operator=操作符返回引用
- 为什么operator=操作符返回引用
- c++的某些操作符为什么要返回引用?为什么经常有书中说对于一些操作符我们要尊重内置类的操作符,所以要返回引用
- 为什么operator=操作符返回引用
- c++中重载输出操作符,为什么要返回引用
- C++赋值运算符重载,为什么要返回引用
- c++笔记05---双目运算符,单目操作符,下标操作符,函数操作符,解引用
- 自增自减操作符的前后缀,下标和解引用操作与自增自减一起使用,还有指针加减法的实现--围绕CheckedPtr类
- 为什么重载输出流符号的时候一定要返回引用
- c++为什么重载输出流符号的时候一定要返回引用
- 为什么不能从子函数中返回临时对象的指针和引用,却可以返回一个临时变量的值
- 了解临时对象的来源 (深刻理解为什么不能返回一个临时变量的引用)
- c++赋值构造函数为什么返回引用类型?
- c++中有些重载运算符为什么要返回引用
- PHP - Manual手册 - 第21章 引用的解释 - 引用返回
- C++赋值运算符重载,为什么要返回引用?
- c++赋值运算符为什么要返回引用?
- c++ 重载 = 为什么返回引用类型