运营商的定义

时间:2013-04-21 15:20:34

标签: c++ class operators

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

我根据这个文件做到了:

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

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

为了支持作业,有两个选项

  1. 索引操作符[]返回引用
  2. 索引操作符[]返回实现赋值的代理对象
  3. 第一种情况是最简单的,但不允许您区分读写操作。第二种方法有点复杂但允许更多控制:

    方法(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);
        };
    };