我刚看到这段代码:
float& operator [] (int);
我想知道为什么我应该使用这个&amp ;,一旦有一些不使用它的上传者。 谢谢!
答案 0 :(得分:3)
float& operator [] (int)
提供对对象内部数据的索引读/写访问权限。数据通过引用返回,因此调用者可以为其分配值,例如:
class myClass {
private:
float arr[10];
public:
float& operator[](int index) { return arr[index]; }
};
myClass m;
float f = m[index];
m[index] = 123.45; // m.arr updated!
另一方面, float operator [] (int)
提供对对象数据的索引只读访问权限。数据按值返回,因此调用者会收到数据的副本,并且无法将值返回给对象内的数据。
class myClass {
private:
float arr[10];
public:
float operator[](int index) const { return arr[index]; }
};
myClass m;
float f = m[index];
m[index] = 123.45; // m.arr not updated!
答案 1 :(得分:1)
您必须考虑如何使用运营商。以std::vector
为例。它可能(除了实现细节)实现其operator[]
函数,如下所示:
T & operator[](size_t index) {
return *(__internal_heap_allocated_array_ptr + index);
}
因此,当您调用my_array[4] = 7
时,它会返回索引4的实际物理位置,允许您为其指定值。
现在想象如果它是这样写的会发生什么:
T operator[](size_t index) {
return *(__internal_heap_allocated_array_ptr + index);
}
如果您尝试执行相同的代码my_array[4] = 7
,则会出现编译错误,并且有充分理由:您正在尝试为副本分配值您访问的值,这在c ++中是不允许的(您不能将值分配给纯rvalues),即使它被允许,也不会更改数组本身的值。
答案 2 :(得分:0)
此运算符按引用(&
)返回,以便您可以按分配更改值,如object[0] = obj.data;
。