#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 main()':
'=':左操作数必须是l值
2) binary'=':找不到运算符 它采用'const Array'类型的左手操作数(或者没有 可接受的转换)
请帮忙。
答案 0 :(得分:3)
你不能修改const引用,试试这个:
//Snippet1
Array& integers4=integers1;
integers4[3] = 2000;
澄清OP对修改const引用的疑虑:
//Snippet2
//This will not compile as you saw.
const Array& integers4=integers1;
integers4[3] = 2000; //errors
现在这就是Xeo在回复post时所做的。他没有更改引用,而是更改原始变量。
//Snippet2
//This will compile and work identically to Snippet1.
const Array& integers4=integers1;
interger1[3] = 2000;
答案 1 :(得分:2)
第一个错误 - integers4
是一个const Array
,因此您只能使用返回const
而不是operator[]
的{{1}} int
。你不能分配给返回的临时int&
,也不能改变const的东西
第二个错误可能是第一个错误的衍生物。
答案 2 :(得分:1)
关于特定的代码:
Array integers1( 4 );
const Array& integers4=integers1;
//integers4[3] = 2000; //Error : non-lvalue in assignment
您正在使用对数组的常量引用来调用成员函数,并且编译器将解析对int Array::operator[]( int x ) const
的调用(operator[]
的其他版本需要非const对象)。该表达式产生一个rvalue,你无法分配它。
integers4 = integers1; //Error : binary '=' : no operator found
同样问题是integers4
是一个常量左值,这意味着它无法修改(因为那里有const
)。