运营商的定义(Definition of operators)

2019-10-18 01:39发布

我试图定义一些运营商。

我根据这个文档做到这一点:

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

任何帮助表示赞赏!

Answer 1:

我认为这是该指数操作。 我对吗?

几乎。 这就是所谓的下标操作符 ,它必须接受一个单一的参数。 您的运营商接受两个,这让你的代码是非法的。

它支持的下一个东西呢?

假设你有一个正确编写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
}


Answer 2:

您可能希望同时拥有一个const和非const运营商的版本:

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

这将允许在你的例子给出两种用法。 它还将允许第二次使用哪怕aconst



Answer 3:

为了支持分配有两种选择

  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);
    };
};


文章来源: Definition of operators