#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;
}
函数,大概只有返回一个左值引用的才可以用作左值。其它基本全为右值。