运算符重载和设置值

时间:2017-08-09 09:48:58

标签: c++ operator-overloading

我创建了一个Container类,并将new关键字与指针结合使用,以了解它是如何工作的以及如何使用它。

template<typename T>
class Container {
private:
    T value;
public:
    Container(T value) {
        this->value = value;
    }
    Container() {

    }
    virtual ~Container() {

    }
    T getValue() {
        return value;
    }
    void setValue(T value) {
        this->value = value;
    }
    void operator[](T value) {
        this->value = value;
    }
};

int main() {

    std::vector<Container<int>*> arr(10);
    for (int i = 0; i < 10; i++) {
        Container<int> *a = new Container<int>;
        a->setValue(i);
//      a[i];
        arr[i] = a;
        std::cout << arr[i]->getValue() << std::endl;
        delete a;
    }

    return 0;
}

[]运算符与setValue()具有相同的代码,但如果我使用a->setValue(i)并且使用a[i]它只打印,则它仅打印从0到9的数字一个随机数。为什么呢?

2 个答案:

答案 0 :(得分:3)

  1. 请参阅Sly_TheKing's answer(将指标运算符应用于指针)。
  2. 索引运算符旨在访问某个引用的特定偏移量的值。它应该接受有符号或无符号整数值并返回一些特定值。所以运营商要有效,应该是这样的:
  3. T& operator[](size_t index)
    {
        return value;
    }
    

    实际上,因为你没有任何东西可以应用索引(在你的情况下唯一有效的索引是0 - 或者从另一个角度来看,在上面的实现中,任何索引都会返回相同的值,所以&amp; ; [0] ==&amp; a [1]将适用 - 这可能在语法上是正确的,但违反了索引运算符的语义...),解除引用运算符会更合适:

    T& operator*() { return value; }
    T& operator->() { return value; }
    

    也可以添加赋值运算符(将替换setValue):

    Container& operator=(T const& value) { this->value = value; return *this; }
    

答案 1 :(得分:1)

排队

 Container<int> *a = new Container<int>;

您将a初始化为指针,因此使用此行

 a[i];

您只需访问存储在a和偏移i * sizeof(container<int>)

中的地址的内存

所以正确的用法是

std::vector<Container<int>*> arr(10);
for (int i = 0; i < 10; i++) {
    Container<int> *a = new Container<int>;

    (*a)[i];
    arr[i] = a;
    std::cout << arr[i]->getValue() << std::endl;
    delete a;
}

使用(*a)[i];访问您在课堂上写的operator[]