C++重载数组运算符

16

我正在创建一个堆,就像这样:

struct Heap {
    int H[100];
    int operator [] (int i) { return H[i]; }
    //...    
};

当我尝试从中打印元素时,我会这样做:

Heap h;
// add some elements...
printf("%d\n", h[3]); // instead of h.H[3]

如果我想设置(而不是访问)它们,就像这样:

for (int i = 0; i < 10; i++) h[i] = i;

我该怎么做?

3个回答

34

提供operator[]函数的几个重载常常是惯用语 - 一个针对const对象,一个针对非const对象。 const成员函数的返回类型可以是const&或值,具体取决于要返回的对象,而非const成员函数的返回类型通常是引用。

struct Heap{
    int H[100];
    int operator [] (int i) const {return H[i];}
    int& operator [] (int i) {return H[i];}
};

使用数组操作符可以修改非const对象。

Heap h1;
h1[0] = 10;

同时仍然允许您访问const对象。

Heap const h2 = h1;
int val = h2[0];

1
数组下标运算符: 通常,提供类似数组访问的用户定义类会定义两个operator[]的重载:const和非const变体:struct T { value_t& operator[](std::size_t idx) { return mVector[idx]; } const value_t& operator[](std::size_t idx) const { return mVector[idx]; } };cppreference - V B

7
你可以返回应该被设置的引用。在返回类型前添加&
int& operator [] (int i){return H[i];}

4
你应该通过引用返回值。当前的版本会复制并编辑此副本,不会影响原始数组。你需要将运算符重载更改为以下内容:
int& operator [] (int i){return H[i];}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接