C++-重载[]运算符
C++ - overloading [] operator
我有一个模板类Array:
template <class T=int, int SIZE=10>
class Array {
T TheArray[SIZE];
public:
void Initialize() {
for (int idx=0; idx < SIZE; idx++) {
TheArray[idx] = T();
}
}
T& operator [](int idx) {
return TheArray[idx];
}
T operator [](int idx) const {
return TheArray[idx];
}
}
我对运算符[]
重载有一些问题(我在网上找到了这个例子)。
我知道T& operator [](int idx)
返回对索引为idx
的数组值的引用,而T operator [](int idx) const
返回其值。但是,我不确定在哪种情况下会使用[]
运算符返回引用或值。
此外,如果我更改T operator [](int idx) const
->T operator [](int idx)
,编译器会抱怨。为什么?我可以理解编译器抱怨是因为只有返回类型不同,但为什么添加const
时不抱怨呢?这只意味着类内部没有任何修改,对吧?
我试着调试这个小的主要实现:
int main() {
int val;
Array<> intArray;
intArray.Initialize();
val = intArray[1];
printf("%d", intArray[1]);
intArray[1] = 5;
}
并且每次调用CCD_ 9。为什么?
提前谢谢。
operator[]
过载将根据您调用它的对象的const
资格来选择。
Array<> intArray;
intArray[1]; //calls T& operator[]
const Array<> constArray;
constArray[1]; //calls T operator[]
如果从T operator[]
中删除const
,则会出现错误,因为成员函数不能具有相同的const
资格和参数,因为无法在它们之间进行选择。
首先,将[]
视为调用this->operator[]
的语法糖。
如果this
是const
指针,则将调用const
版本,否则将调用非const
版本。
接下来,您应该使用const T& operator [](int idx) const {
,即让const
版本返回const
引用。这将节省进行深度复制的开销。
最后,函数的const
-ness是其签名的部分。这允许您根据const
-ness进行过载。否则你就不能拥有operator[]
的两个版本。
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板