使用&在运算符重载

时间:2016-03-18 21:18:24

标签: c++ operators overloading

我刚看到这段代码:

float& operator [] (int);

我想知道为什么我应该使用这个&amp ;,一旦有一些不使用它的上传者。 谢谢!

3 个答案:

答案 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;