我试图定义一些运营商。
我根据这个文档做到这一点:
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
任何帮助表示赞赏!
我认为这是该指数操作。 我对吗?
几乎。 这就是所谓的下标操作符 ,它必须接受一个单一的参数。 您的运营商接受两个,这让你的代码是非法的。
它支持的下一个东西呢?
假设你有一个正确编写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
}
您可能希望同时拥有一个const
和非const
运营商的版本:
int operator[](int index) const { ... }
int& operator[](int index) { ... }
这将允许在你的例子给出两种用法。 它还将允许第二次使用哪怕a
是const
。
为了支持分配有两种选择
- 索引操作符
[]
返回参考 - 索引操作符
[]
返回实现分配的代理对象
第一种情况是最简单的,但不会让你读,写操作区别开来。 第二种方法是有点复杂,但允许更多的控制:
的方法的示例(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);
};
};