重载函数调用操作符和赋值
Overloading function call operator and assignment
在我的一个项目中,我正在为std::vector
编写一个包装器。我这样做是因为我使用的是齐次坐标,对于某些操作来说,暂时"忘记"第四个坐标更容易。
Vector v;
v(0) = 5;
v(1) = 6;
等等。我还想做以下事情:
double x;
x = v(0);
对于最后一件事,我可以重载()操作符,但是如何实现第一件事呢?(0和1是索引)
只返回引用。
class Vector
{
int data[4];
int & operator() (int index) { return data[index]; }
};
返回要修改的元素的非const引用。
两件事
-
您可能应该重载
operator[]
而不是operator()
来完成此操作,因为它在这里是更自然的操作符。operator()
用于创建函数对象,而operator[]
是运算符,意思是"挑出这个位置的元素"。 -
可以通过让函数返回一个应该写入的值的引用来支持对
operator[]
/operator()
的结果赋值。作为一个简单的例子,下面的一些代码表示一个包装原始数组的类:
class Array {
public:
int& operator[] (unsigned index);
int operator[] (unsigned index) const;
private:
int array[137];
};
int& Array::operator[] (unsigned index) {
return array[index];
}
int Array::operator[] (unsigned index) const {
return array[index];
}
第二个函数是const
重载,因此您可以让const Array
读取但不写入值。
在标准库中,这样的事情是通过使用operator()
(实际上通常是operator[]
)返回类型double &
来实现的。通过返回对double类型的引用,可以对其进行赋值或赋值。
然而,你确定你想把这个围绕std::vector
?这个类不是数学意义上的向量;它很像Java的ArrayList
,所以对于小结构来说一点效率都没有。通常,当我编写自己的向量类时,我打算在周围有很多这样的类,所以我在静态数组的基础上从头开始实现一个类。
相关文章:
- 显式调用普通默认构造函数会导致额外的赋值调用
- 在原始对象上使用惯用(例如 TBB 的 thread_enumerable_specific')移动赋值调用析构函数
- 通过调用Move赋值操作符实现Move构造函数
- 如何从复制赋值操作符调用复制构造函数
- 即使类没有定义构造函数,也不能在类上调用c++默认的move赋值操作符
- 复制构造函数和赋值操作符都被调用
- 可以在move赋值操作符中调用析构函数吗?
- 在c++中使用赋值操作符而不是调用函数
- 赋值操作符重载未被调用
- Visual c++ 2010 / QT:为什么要调用类的赋值操作符
- 为什么赋值操作符用于深度复制,谁调用它
- 如果在调用时没有取赋值操作符的返回类型,将会发生什么?
- 在重载赋值操作符内调用构造函数
- 模板操作符赋值重载未被调用
- 在构造函数(re. noexcept)期间调用哪个操作符来赋值给const引用
- 重载函数调用操作符和赋值
- 退出重载赋值操作符将调用析构函数来删除对象
- C++从重载的复制赋值运算符中调用默认的复制赋值操作符
- 在赋值操作符中调用复制构造函数
- 类使用自身/深度复制时赋值/复制操作符重载