重载函数调用操作符和赋值

Overloading function call operator and assignment

本文关键字:赋值 调用操作符 函数 重载      更新时间:2023-10-16

在我的一个项目中,我正在为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引用。

两件事

  1. 您可能应该重载operator[]而不是operator()来完成此操作,因为它在这里是更自然的操作符。operator()用于创建函数对象,而operator[]是运算符,意思是"挑出这个位置的元素"。

  2. 可以通过让函数返回一个应该写入的值的引用来支持对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,所以对于小结构来说一点效率都没有。通常,当我编写自己的向量类时,我打算在周围有很多这样的类,所以我在静态数组的基础上从头开始实现一个类。