我正在尝试定义一些运算符。
我根据这个文件做到了:
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
任何帮助表示赞赏!
答案 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) { ... }
这将允许您的示例中给出的两种用法。即使a
为const
,它也会允许第二次使用。
答案 2 :(得分:1)
为了支持作业,有两个选项
[]
返回引用[]
返回实现赋值的代理对象第一种情况是最简单的,但不允许您区分读写操作。第二种方法有点复杂但允许更多控制:
方法(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);
};
};