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

时间:2011-08-02 21:15:29

标签: c++ operator-overloading

在我的一个项目中,我正在为std::vector编写一个包装器。我这样做是因为我使用的是齐次坐标,对于某些操作来说,暂时“忘记”第四个坐标更容易。

现在我偶然发现了一个问题。我有大量的作业,如下所示:

    Vector v;
    v(0) = 5;
    v(1) = 6;

等等。我还想做以下事情:

   double x;
   x = v(0);

对于最后一件事,我可以重载()运算符,但是如何实现第一件事? (零和一个是索引)。

4 个答案:

答案 0 :(得分:5)

只需返回参考。

class Vector
{
  int data[4];
  int & operator() (int index) { return data[index]; }
};

答案 1 :(得分:1)

返回对要修改的元素的非const引用。

答案 2 :(得分:1)

两件事 -

  1. 您可能应该超载operator[]来执行此操作而不是operator(),因为这是更自然的操作符。 operator()用于创建函数对象,而operator[]是运算符,意思是“在此位置挑选元素。”

  2. 您可以通过让函数返回对应写入的值的引用来支持赋值operator[] / operator()的结果。举个简单的例子,这里有一些代表包装原始数组的类的代码:

  3. (代码在这里:)

    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读取但不能写入值。

答案 3 :(得分:1)

在标准库中,通过让operator()(实际上通常是operator[])返回类型double &来实现这些功能。通过返回对double的引用,您可以分配给它或从中分配。

但是,您确定要将其包裹在std::vector左右吗?这个类不是数学意义上的向量;它很像Java ArrayList,因此对于小型结构来说效率不高。通常当我编写自己的矢量类时,我正计划在它们周围使用它们,所以我在静态数组之上从头开始实现一个类。