运营商[]后的分配

时间:2018-01-17 14:38:09

标签: c++ operator-overloading

我正在学习c ++,我试着知道在调用operator =之后是否可以使用赋值[]运算符

我有一个包含私有int *_content数据的数组类,并且运算符=已重载。 他的构造函数按照传入参数的大小来分配我的_content

我的班级看起来像:

class Array {

private:
    int *_content;

public:    
    Array(unsigned int n) {
        this->_content = new int[n];
    }

    ~Array() {
            delete[] _content;
    }

    int operator[](int n) const {
        return this->_content[n];
    }
};

我可以写下面的代码:

int main() {
    Array a(10);

    std::cout << a[5] << std::endl;
    return 0;
}

结果:

0

我想知道在使用n之后,是否有可能由任何运营商分配我的内容[]

a[5] = 2000;

并且知道在我的情况下是否有任何干净的解决方案。 谢谢你的回复

4 个答案:

答案 0 :(得分:5)

是的,要做到这一点,您需要提供一个[]版本,它将引用返回到容器中的元素:

int& operator[](int n) {
    return this->_content[n];
}

然后,您可以通过该引用修改数组元素,并使用您在调用站点提出的确切语法。

其他事项:您还需要定义赋值运算符和复制构造函数。我们称之为“三个规则”。见What is The Rule of Three?。并且可能想到捕获在构造上传递的容器的大小。然后,您可以检查传递给n重载的[]是否在支持数组的范围内。

答案 1 :(得分:4)

至少你可以通过以下方式重载operator []

const int & operator[]( size_t n) const 
{
    return this->_content[n];
}

int & operator[]( size_t n) 
{
    return this->_content[n];
}

答案 2 :(得分:1)

operator[]返回引用,然后您可以指定返回的值:

int& operator[](int n) {
    return this->_content[n];
}

然后你可以写

a[5] = 100;

答案 3 :(得分:0)

当然,它可能,只需让operator []返回int&

```

int& operator[](int n) const {
    return this->_content[n];
    }

```

然后

int main() {
    Array a(10);
    a[5]=1;
    std::cout << a[5] << std::endl;
    return 0;
}