用于分配和检索的支架过载; const,参考

时间:2015-11-25 23:11:45

标签: c++ overloading accessor brackets mutators

关于在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”;值可以改变,函数返回值不能是常量。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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= isn&#39; ta const成员函数,因此您不会成为在这种情况下能够使用operator=(这正是您通常想要的)。