C++ 重载数组运算符

Posted

技术标签:

【中文标题】C++ 重载数组运算符【英文标题】:C++ overloading array operator 【发布时间】:2016-08-30 19:08:26 【问题描述】:

我正在创建一个堆,如下所示:

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;

我该怎么办?我不能像以前那样做...

谢谢!

【问题讨论】:

【参考方案1】:

您可以返回对应该设置的内容的引用。将&amp; 添加到返回类型。

int& operator [] (int i)return H[i];

【讨论】:

【参考方案2】:

您应该通过引用返回。使用您当前的版本,您将复制并编辑此副本,这不会影响原始阵列。您必须将运算符重载更改为:

int& operator [] (int i)return H[i];

【讨论】:

【参考方案3】:

提供operator[] 函数的几个重载是惯用的——一个用于const 对象,一个用于非const 对象。 const 成员函数的返回类型可以是const&amp; 或只是一个值,具体取决于返回的对象,而非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];

【讨论】:

以上是关于C++ 重载数组运算符的主要内容,如果未能解决你的问题,请参考以下文章

使用数组重载运算符“=”会导致运行时错误 C++

C++ 运算符重载四(自定义数组类)

C++ 作业 - 使用动态数组重载 >> 运算符

C++ 运算符重载

C++中赋值运算操作符和=重载有啥区别?

C++ - 重载 [] 运算符