用于分配和检索的括号过载;const,引用
Bracket Overload for Assignment and Retrieval; const, reference
关于C++中重载括号,我的编译器正在使用mutator方法进行访问。有人能告诉我为什么吗?
1. const int & Cheese::operator [] (int i)const { return weight[i]; } //accessor
2. int & Cheese::operator [] (int i) { return weight[i]; } //mutator
例如,下面的cout命令使用赋值函数定义(上面的#2)来访问数据。
Cheese cheddar;
cout << cheddar[2] << endl;
为什么不使用第一个函数(访问器)来获取数据?我认为,由于cout只是一种检索,它会向第一个开火。
编译器如何知道要调用其中的哪一个?
编者按:为了完整起见,我指的是用作"设置器",比如
cheddar[2] = 100;
两者加在一起如下:
cheddar[2] = cheddar[1];
其中rhs只是一个"getter"。它只检索cheddar[1]的值,不更改任何内容,因此可以是const。相反,lhs括号重载cheddar[2]用作"setter";值可以更改,函数返回值不能为常量。
它为任何常量实例(如const Cheese
或const Cheese&
)调用第一个实例,为可变实例调用第二个实例。
如果你关心一种方法,可以大致得到你想要的效果(特别是,执行一个函数来获得值,其他代码来设置值,这是可靠的),有一种方法可以做到。
通常的方法是返回一个代理,而不是直接返回值(或对它的引用)。代理过载operator T
和operator=
。
template <class T>
class Proxy {
T value;
public:
Proxy(T v) : value(v) {}
// used only to get value
operator T() const { return value; }
// used only to set value
Proxy &operator=(T new_value) {
value = new_value;
return *this;
}
};
然后您的重载只返回一个实例:
Proxy<Cheese &> operator[](int i) { return Proxy<int>(weight[i]); }
Proxy<Cheese const &> operator[](int i) const { return Proxy<int>(weight[i]); }
请注意,在第二种情况下,T
的类型为Cheese const &
,而operator=
不是const
成员函数,因此在这种情况下无法使用operator=
(这正是您通常想要的)。
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 对临时对象的Const引用不会延长其生存期
- 对 const 引用参数使用默认值会导致崩溃
- 在运算符重载中使用带有 const 引用的 friend 函数
- C++通过 const 引用传递时不调用派生类函数
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 为什么要返回对小类成员的 const 引用?
- C - 最好将枚举类作为值或const引用
- RVO:返回由值传递的值,即使显式分配给 const 引用也是如此
- const引用与可变成员的对象
- 每当传递lvalue时,每当通过rvalue传递时,将const引用存储
- 对类成员而不是 getter 的 Const 引用
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- STD ::配对的const引用如何工作
- 为什么我的C 函数拒绝返回const引用