C ++ operator []重载没有响应

时间:2015-05-27 23:13:22

标签: c++ operator-overloading overloading

我已经创建了类数组,但有些东西很奇怪..该类如下:

class array
{
    private:
        int *a_;
        size_t size_;
    public:
        array();
        array(const size_t);
        array(const arreglo &);
        ~array();
        int const &operator[](size_t)const;
        int &operator[](size_t);
        array const &operator=(const array&);
        bool empty()const;
};

[]的重载实现是:

int const &array::operator[](size_t index)const
{
    std::cout << "getter" << std::endl; 
    return a_[index]; 
}
int & array::operator[](size_t index)
{
    std::cout << "setter" << std::endl; 
    return a_[index]; 
}

我测试代码的方式主要在于:

int main()
{
    array a(7);
    a[0] = 3;
    a[1] = 6;
    a[2] = a[0] + a[1];
    array b = a;
    std::cout << b[2] << std::endl;
    return 0;
}

问题是opertar []只是使用getter版本并通过cout&#34; setter&#34;从来没有&#34; getter&#34;。 出了什么问题?

2 个答案:

答案 0 :(得分:1)

将他们视为&#34; getter&#34;和&#34; setter&#34;变种是一个错误。两者之间的区别仅仅是函数的cv限定和返回类型。他们都是吸气剂。更重要的是,您正在返回引用类型。

引用倾向于衰减,在本例中是一个可变的int,因此编译器更可能接受非const函数调用。

a[0];

此语句的默认评估是整数值,而不是引用,因此您可以执行以下操作:

if (a[0])

这是对[0]的值而不是引用的谓词(评估引用总是正确的,并且不是很有用)。

请记住,在大多数语句中使用引用时,它们会衰减到引用的值。

int v = a[0]; // no error, even tho v's type is not int&
int& vr = a[0]; // decays to the value a references
                // then takes a reference of that

(注意:编译器可能会忽略隐含的操作集,以便在第二个语句中简单地捕获或暗示原始引用。)

所以代码

a[2] = a[0] + a[1]

首先从[0]和[1]获取值,知道它想要做数学,所以最简单的方法是:

int a1 = a.operator[](1);
int a0 = a.operator[](0);
int& dest = a.operator[](2);
dest = a0 + a1;

如果你想要const,你需要一个const / const-ref到一个数组或指定你想要一个const ref:

const int& ar = a[0];

#include <iostream>

struct array
{
    int i = 0;
    array() {}
    const int &operator[](size_t) const { std::cout << "const int[]\n"; return i; }
    int &operator[](size_t) { std::cout << "int[]\n"; return i; }
};

int main()
{
    array a;
    a[0];
    int v1 = a[0];
    const int v2 = a[0];
    std::cout << "refs\n";
    int& v3 = a[0];
    const int& v4 = a[0];
    std::cout << "const array\n";
    const array b;
    b[0];
    int v5 = b[0];
    const int v6 = b[0];
    std::cout << "refs\n";
    //int& v7 = b[0]; // would produce a compile error
    const int& v8 = b[0];
}

请参阅http://ideone.com/7EYGYj

答案 1 :(得分:0)

简而言之

void f(const array& b){
     std::cout << b[2] << std::endl;
}

b必须是const。所有可用的是const函数。

在您的示例中,它是“读取”但 b 不是const,因此调用非const。它使用“setter”作为吸气剂。