C++ 重载数组运算符
C++ overloading array operator
我正在创建一个堆,如下所示:
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;
我该怎么办?
您可以return参考应设置的内容。将 &
添加到 return 类型。
int& operator [] (int i){return H[i];}
您应该 return 作为参考。使用您当前的版本,您正在复制并编辑此副本,这不会影响原始阵列。您必须将运算符重载更改为:
int& operator [] (int i){return H[i];}
提供几个 operator[]
函数的重载是惯用的——一个用于 const
对象,一个用于非 const
对象。 const
成员函数的 return 类型可以是 const&
或只是一个值,具体取决于被 returned 的对象,而非 return 类型的成员函数-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];
我正在创建一个堆,如下所示:
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;
我该怎么办?
您可以return参考应设置的内容。将 &
添加到 return 类型。
int& operator [] (int i){return H[i];}
您应该 return 作为参考。使用您当前的版本,您正在复制并编辑此副本,这不会影响原始阵列。您必须将运算符重载更改为:
int& operator [] (int i){return H[i];}
提供几个 operator[]
函数的重载是惯用的——一个用于 const
对象,一个用于非 const
对象。 const
成员函数的 return 类型可以是 const&
或只是一个值,具体取决于被 returned 的对象,而非 return 类型的成员函数-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];