分配和检索的括号过载;常量,参考
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 只是一个检索,它会在第一个触发。
编译器如何知道调用其中的哪一个?
编辑:为了完整起见,通过增变器,我的意思是像这样用作 "setter,":
cheddar[2] = 100;
两者合起来如下:
cheddar[2] = cheddar[1];
其中 rhs 只是一个 "getter." 它只是检索 cheddar[1] 的值,不会更改任何内容,因此可以是 const。相比之下,lhs 括号重载 cheddar[2] 函数作为 "setter;" 值可以更改,而函数 return 值不能是 const.
它为任何常量实例(如 const Cheese
或 const Cheese&
)调用第一个,为可变实例调用第二个。
如果您关心一种方法,您可以 大致获得您似乎想要的效果(具体来说,执行一个函数来获取值,并设置其他代码价值,可靠地),有一种方法可以做到这一点。
通常的方法是 return 代理而不是直接 returning 值(或对它的引用)。代理重载 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;
}
};
那么您的重载只是 return 的一个实例:
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=
(这正是您通常想要的)。
关于 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 只是一个检索,它会在第一个触发。
编译器如何知道调用其中的哪一个?
编辑:为了完整起见,通过增变器,我的意思是像这样用作 "setter,":
cheddar[2] = 100;
两者合起来如下:
cheddar[2] = cheddar[1];
其中 rhs 只是一个 "getter." 它只是检索 cheddar[1] 的值,不会更改任何内容,因此可以是 const。相比之下,lhs 括号重载 cheddar[2] 函数作为 "setter;" 值可以更改,而函数 return 值不能是 const.
它为任何常量实例(如 const Cheese
或 const Cheese&
)调用第一个,为可变实例调用第二个。
如果您关心一种方法,您可以 大致获得您似乎想要的效果(具体来说,执行一个函数来获取值,并设置其他代码价值,可靠地),有一种方法可以做到这一点。
通常的方法是 return 代理而不是直接 returning 值(或对它的引用)。代理重载 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;
}
};
那么您的重载只是 return 的一个实例:
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=
(这正是您通常想要的)。