从一个小项目看return 引用 重载运算符
#ifndef _ARRAY_H_ #define _ARRAY_H_ class Array { private: int mLength; int* mSpace; public: Array(int length); Array(const Array& obj); int length(); void setData(int index, int value); int getData(int index); ~Array(); public: int& operator[](int i); Array& operator=(Array &a); }; #endif #include "iostream" #include "Array.h" using namespace std; Array::Array(int length) { if( length < 0 ) { length = 0; } mLength = length; mSpace = new int[mLength]; } Array::Array(const Array& obj) { mLength = obj.mLength; mSpace = new int[mLength]; for(int i=0; i<mLength; i++) { mSpace[i] = obj.mSpace[i]; } } int Array::length() { return mLength; } void Array::setData(int index, int value) { mSpace[index] = value; } int Array::getData(int index) { return mSpace[index]; //返回的只是一个值,没有内存地址,作不了左值,mSpace[index]本身是有内存地址的
} Array::~Array() { mLength = -1; delete[] mSpace; } int& Array::operator[](int i) { return mSpace[i]; //正常,因为mSpace[i]本身是有内存地址的,返回一个具有内存地址的数据是可以作引用的. return this->getData(i);//这里会提示"非常量的引用初始化必须为左值, 难道this->getData(i)作不了左值?" //解答:this->getDate(i)这个函数返回的只是一个值,this->getDate(i),只是返回65行函数的类型int,没有内存地址,可能存在于除了内存区外的任何地区,所以作不了引用. //这里要确保this->getDate(i)有内存地址,所以this->getDate(i)的返回必须是引用. } Array& Array::operator=(Array &a) { mLength = a.mLength; mSpace = new int[mLength]; for (int i = 0; i < mLength; i++) { mSpace[i] = a[i]; } return *this; }
函数,大概只有返回一个左值引用的才可以用作左值。其它基本全为右值。