#include <iostream>
#include <vector>
#include <list>
using namespace std;
// 数组类
class DataInt
{
public:
explicit DataInt() :pData(0), capacity(0), sizeCount(0)
{
}
DataInt(int _capacity) :capacity(_capacity), sizeCount(0)
{
pData = new int[capacity];
}
// 显式声明拷贝构造函数
explicit DataInt(const DataInt &di)
{
capacity = di.capacity;
sizeCount = di.sizeCount;
pData = new int[capacity];
for (int i = 0; i < di.sizeCount; i++)
{
pData[i] = di.pData[i];
}
}
// 析构函数
~DataInt()
{
release();
}
DataInt& operator=(DataInt & di)
{
capacity = di.capacity;
sizeCount = di.sizeCount;
pData = new int[capacity];
for (int i = 0; i < di.sizeCount; i++)
{
pData[i] = di.pData[i];
}
return *this;
}
void PushBack(int n)
{
pData[sizeCount++] = n;
}
void ShowAll()
{
int i = 0;
while (i<sizeCount)
{
cout << pData[i++] << endl;
}
}
int & operator[](int idx)
{
return pData[idx];
}
private:
void release()
{
delete [] pData;
capacity = 0;
}
private:
int * pData; // 指向数据
int capacity; // 开始固定容量
int sizeCount; // 当前已经存在数量
};
int main()
{
DataInt d(10);
d.PushBack(66);
d.PushBack(77);
d.PushBack(88);
d.ShowAll();
cout << d[0] << endl;
cout << d[1] << endl;
cout << d[2] << endl;
d[0] = 99999;
d.ShowAll();
return 0;
}
问题:operator[]重载函数int & operator[](int idx)中的&能否去掉?如果不能去掉,原因是什么?
答:不能去掉。
原因:如果去掉了,返回的值是一个临时的值,不是类内数据。一旦创建引用对象来引用返回值,则无法引用到类内数据,其实质是对一个临时值进行引用。所以无法用引用来的数据修改类内数据。此时我们编译的时候会提示错误:d[0]不是左值。