1

关于 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 命令使用 mutator 函数定义——上面的#2——来访问数据。

Cheese cheddar;
cout << cheddar[2] << endl;

为什么不使用第一个函数——访问器——来获取数据?我认为,由于 cout 只是一个检索,它会在第一个触发。

编译器如何知道要调用其中的哪一个?

编辑:为了完整起见,通过mutator,我的意思是用作“setter”,如下所示:

cheddar[2] = 100;

两者一起如下:

cheddar[2] = cheddar[1];

rhs 只是一个“吸气剂”。它只是检索cheddar[1]的值,不改变任何东西,因此可以是 const。相比之下,lhs 括号重载cheddar[2]用作“setter”;值可以改变,函数返回值不能是const。

4

2 回答 2

5

它为任何常量实例(如const Cheeseor const Cheese&)调用第一个,为可变实例调用第二个。

于 2015-11-25T23:13:52.870 回答
2

如果您关心一种可以大致获得您想要的效果的方法(特别是,执行一个函数来获取值,并可靠地设置其他代码来设置值),有一种方法可以做到这一点。

通常的方法是返回一个代理而不是直接返回值(或对它的引用)。代理重载operator Toperator=.

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=在这种情况下使用(这正是您通常想要的)。

于 2015-11-26T01:20:24.457 回答