常量和非常量运算符重载
Const and Non-Const Operator Overloading
我有一个让我感到困惑的话题,我需要详细说明一下。它是带有 const 版本和非 const 版本的运算符重载。
// non-const
double &operator[](int idx) {
if (idx < length && idx >= 0) {
return data[idx];
}
throw BoundsError();
}
我知道这个lambda函数,获取索引并检查其有效性,然后返回类中数组数据的索引。还有一个具有相同主体但函数调用为
const double &operator[](int idx) const
为什么我们需要两个版本?
例如,在下面的示例代码中,下面的每个实例使用哪个版本?
Array a(3);
a[0] = 2.0;
a[1] = 3.3;
a[2] = a[0] + a[1];
我的假设是,const 版本仅在a[2]
调用,因为我们不想冒险修改a[0]
或a[1]
。
感谢您的任何帮助。
当两个版本都可用时,逻辑非常简单:const
为const
对象调用版本,为非const
对象调用非const
版本。就这样。
在代码示例中,a
是一个非const
对象,这意味着在所有情况下都会调用非const
版本。示例中永远不会调用const
版本。
拥有两个版本的要点是对非const
对象实现"读/写"访问,而对const
对象仅实现"读"访问。对于const
对象const
调用operator []
版本,这将返回const double &
引用。您可以通过该常量引用读取数据,但不能通过它写入。
提供一个代码示例来补充上面的答案:
Array a(3);
a[0] = 2.0; //non-const version called on non-const 'a' object
const Array b(3);
double var = b[1]; //const version called on const 'b' object
const Array c(3);
c[0] = 2.0; //compile error, cannot modify const object
我想
如果有这样的选择
double k = 3.0;
数组的元素是常量
a[0] = a[1] + k; or std::cout << a[0] + k;
const double &operator[](int idx) const
版本将被调用。在这里,您将非常量变量添加到常量对象。
相关文章:
- 什么时候可以使用常量装饰调用我的重载函数?
- 如何为非常量和常量重载实现一次成员函数?
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 重载模板化类的[]运算符的常量版本
- 引用模板类型的赋值运算符需要非常量重载
- MSVC:推理指向具有常量和非常量重载的成员函数的指针
- 为什么 lambda 自动和参数选择常量重载?
- 非常量指针更喜欢常量 T&重载而不是常量 T*
- asio_handler_invoke常量重载
- 不能只删除方法的常量重载?
- 如何获取提供常量重载的函数类型
- 基于常量重载
- 二元运算符 + , = 使用常量重载
- 如何检查成员函数是否具有常量重载
- C++使用一个参数常量重载
- 为什么常量左值与给定 T&& 和常量 T& 重载的常量右值绑定不同?
- 指向常量重载成员函数的指针
- 常量重载和共享指针
- c++非常量-常量重载方法选择
- 如何调用非常量重载