1

我正在尝试定义一些运算符。

我是根据这个文档做的:

http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html

是否存在应该定义两次的运算符?

我认为它是索引运算符。我对吗?我将其定义为:

int operator [] (const int power) const{
    // here there is some code
}

假设我正确实现了它,那么应该定义两次的运算符是什么?

它支持接下来的事情吗?

a[1] = 3;
cout << a[1]; // I defined the << operator

任何帮助表示赞赏!

4

3 回答 3

2

您可能希望同时拥有运算符的 aconst和非const版本:

int operator[](int index) const { ... }
int& operator[](int index) { ... }

这将允许您的示例中给出的两种用法。即使ais ,它也将允许第二次使用const

于 2013-04-21T15:25:25.997 回答
2

我认为它是索引运算符。我对吗?

几乎。它被称为下标运算符,它必须接受一个参数。您的运营商接受两个,这使您的代码非法。

它支持接下来的事情吗?

假设你有一个正确编写的operator [](在不知道应用程序逻辑的一些上下文的情况下,我不知道如何编写一个),那么你提到的两个指令都应该得到支持。

但是,为了做到这一点:

a[1] = 3;

要合法(如果返回基本类型),operator []应该返回一个左值引用 - 因此,int&而不是int. 当然,这意味着左值引用所绑定的对象不能是本地对象或临时对象,因为这意味着返回一个悬空引用。

int& operator [] (const int power) { // <== The function cannot be "const" if you
// ^                                 //     are returning a non-const lvalue ref
                                     //     to a data member or element of a data
                                     //     member array
    // here there is some code
}

您可能还需要一个const版本的下标运算符:

int operator [] (const int power) const {
// No need to use a int const&    ^^^^^
// here, that is basically the    This member function can be const, since it is
// same as returning an int by    neither modifying the object on which it is
// value                          invoked, nor returns any non-const lvalue ref
                                  to a data member or an element of data member
    // here there is some code
}
于 2013-04-21T15:24:08.340 回答
1

为了支持分配,有两个选项

  1. 索引运算符[]返回一个引用
  2. 索引操作符[]返回一个实现赋值的代理对象

第一种情况是最简单的,但不允许您区分读取和写入操作。第二种方法有点复杂,但允许更多控制:

方法(2)的一个例子如下

struct MyArray {
    std::vector<int> v;

    MyArray(int n) : v(n) {}

    struct ItemRef {
        MyArray& a;
        int index;

        ItemRef(MyArray& a, int index)
          : a(a), index(index)
        {}

        int operator=(int x) {
            printf("Writing to element %i\n", index);
            a.v[index] = x;
            return x;
        }

        operator int() {
            printf("Reading element %i\n", index);
            return a.v[index];
        }
    };

    ItemRef operator[](int index) {
        if (index < 0 || index >= int(v.size()))
            throw std::runtime_error("Invalid index");
        return ItemRef(*this, index);
    };
};
于 2013-04-21T15:32:37.150 回答