我理解rhs代表右手边,但我不明白编译器如何理解“rhs”指的是右手边。有人能解释一下在什么情况下会需要这种重载吗?
MyArray<T>& operator=(const MyArray<T>& rhs);
我理解rhs代表右手边,但我不明白编译器如何理解“rhs”指的是右手边。有人能解释一下在什么情况下会需要这种重载吗?
MyArray<T>& operator=(const MyArray<T>& rhs);
rhs
代表 "right hand side",实际上该变量的名称可以是任何你喜欢的名字。operator=
的语法要求它必须是这种方式。class A
{
public:
A& operator=(const A& other);
};
该语言定义了使用此运算符的形式为:
A a, b;
a = b;
以上代码调用了A::operator=(const &other)
,将名称为a
的A
实例作为赋值操作符的左操作数,使用名称为b
的A
实例作为右操作数other
。
MyArray<T>& operator=(const MyArray<T>& rhs);
函数参数通常被命名为rhs
,因为当调用运算符时它出现在赋值的右侧。这样做可以提高源代码的可读性。rhs
只是人们通常用来表示该运算符的名称,它没有特殊含义。该运算符的定义方式总是使参数成为右侧元素。
int a = 5;
int b = 3;
a = b;
任务部分实际上只是一个函数调用:
a.operator=(b);
没有什么特别的事情发生。参数名称并不重要,只有由返回类型和参数类型组成的签名才是重要的,而不是名称。
与任何函数一样,你可以将参数命名为任何你想要的名称。
以赋值运算符为例,如果你有这样一个示例:
MyArray<int> arr1, arr2;
arr1 = arr2;
这相当于
MyArray<int> arr1, arr2;
arr1.operator=(arr2);
class MyArray{
public:
int* arr;
int len;
MyArray( int l ){
arr = new int[l];
len = l;
}
~MyArray(){
delete [] arr;
}
};
MyArray ob1(3);
for( int i=0; i<3; i++ )
ob1[i]=i*i; // ob1 = {0, 1, 4}
MyArray ob2(3);
for( int i=0; i<3; i++ )
ob2[i]=i+1; // ob2 = {1, 2, 3}
ob1 = ob2
;编译器会使arr1指向arr2,因此,如果Ob2被更改为{4,5,6},Ob1也会更改为{4,5,6},这称为浅拷贝。为了避免这种情况,我们添加了以下内容。MyArray& operator=(const MyArray& rhs){
for( int i=0; i<rhs.len; i++ ) this.arr[i] = rhs[i];
}
rhs
只是参数名称。 - George Sovetov