#include <iostream>
using namespace std;
class Array
{
friend ostream &operator<<(ostream &, const Array &);
public:
Array(int = 5);
Array(const Array &);
~Array();
int getSize() const;
const Array &operator=(const Array &);
// subscript operator for non-const objects returns modifiable lvalue
int &operator[](int);
// subscript operator for const objects returns rvalue
int operator[](int) const;
private:
int size;
int *ptr;
};
Array::Array(int arraySize)
{
size = (arraySize > 0 ? arraySize : 5); // validate arraySize
ptr = new int[ size ];
for (int i = 0; i < size; i++)
ptr[ i ] = 0;
}
// must receive a reference to prevent infinite recursion
Array::Array(const Array &arrayToCopy)
: size(arrayToCopy.size)
{
ptr = new int[ size ]; // create space for pointer-based array
for (int i = 0; i < size; i++)
ptr[ i ] = arrayToCopy.ptr[ i ]; // copy into object
}
Array::~Array()
{
delete [] ptr; // release pointer-based array space
}
int Array::getSize() const
{
return size; // number of elements in Array
}
const Array &Array::operator=(const Array &right)
{
if (&right != this) // avoid self-assignment
{
if (size != right.size)
{
delete [] ptr; // release space
size = right.size; // resize this object
ptr = new int[ size ]; // create space for array copy
}
for (int i = 0; i < size; i++)
ptr[ i ] = right.ptr[ i ]; // copy array into object
}
return *this;
}
// overloaded subscript operator for non-const Arrays reference return creates a modifiable lvalue
int &Array::operator[](int subscript)
{
cout << " ***************Inside non-sonstant operator[] function: Lvalue test*********** ";
if (subscript < 0 || subscript >= size)
{
cerr << "\nError: Subscript " << subscript
<< " out of range" << endl;
exit(1); // terminate program; subscript out of range
}
return ptr[ subscript ]; // reference return
}
// overloaded subscript operator for const Arrays const reference return creates an rvalue
int Array::operator[](int subscript) const
{
cout << " ***************Inside sonstant operator[] function: Rvalue test*********** ";
if (subscript < 0 || subscript >= size)
{
cerr << "\nError: Subscript " << subscript
<< " out of range" << endl;
exit(1);
}
return ptr[ subscript ]; // returns copy of this element
}
// overloaded output operator for class Array
ostream &operator<<(ostream &output, const Array &a)
{
int i;
// output private ptr-based array
for (i = 0; i < a.size; i++)
{
output << a.ptr[ i ] << " ";
if ((i + 1) % 4 == 0)
output << endl;
} // end for
if (i % 4 != 0)
output << endl;
return output;
}
int main()
{
Array integers1(4);
Array integers2; // 5-element Array by default
const Array& integers4=integers1;
//integers4[3] = 2000; //Error : non-lvalue in assignment
integers1 = integers1; //valid
integers4 = integers1; //Error : binary '=' : no operator found
//which takes a left-hand operand of type 'const Array' (or there is no
//acceptable conversion)
cout << "\nintegers1[3] is " << integers4[ 3 ];
return 0;
}
给出错误:错误:非左值在分配
1) 在函数'INT主()':
'=':左操作数必须是左值
2) 二进制“=”:没有操作员发现 ,其采用类型“const的阵列”的左边的操作数(或不存在 可接受的转换)
请帮忙。
这是功课吗? – ildjarn 2011-05-20 23:27:54
顺便说一下,你几个小时前问一个关于const引用的问题[这里](http://stackoverflow.com/questions/6077332/does-reference-changes-the-state-of-the-referent/6077369#6077369 )。请仔细阅读所有回复,因为其他人经历了很多麻烦解释这一点。 – user258808 2011-05-20 23:31:05
他修改了原始变量。 – user258808 2011-05-20 23:34:16