构造运算符的结果与在默认构造的对象上运行的结果

时间:2013-07-23 22:29:57

标签: c++ constructor operators

我有一个类,它本质上是一个带有标记内容的数组,我想为它定义一些运算符。我想以这样的方式做到这一点,即改变类中元素的数量很容易,因为我希望未来的用户会改变跟踪的变量,但我也想确保类的基本算术运算是尽可能高效。

我可以看到两种实现运算符的方法。以Vector2D类:

为例
struct Vector2D {

    //members
      const static int nElem = 2;
      double x;
      double y;

    //Constructors
      Vector2D() {}          
      Vector2D(double X, double Y) : x(X), y(Y) {}

    //Operators
      double& operator[] (int index) {
        switch(index) { 
          case 0:
            return x;
          case 1:
            return y;
          default:
            return std::out_of_range ("Oops");
        }
      }

    // Option 1: operator+ by constructing result
    Vector2D operator+ (const Vector2D & rhs) const {
      return Vector2D(x + rhs.x, y+rhs.y);
    }

    // Option 2: operator+ using loop and [] operator
    Vector2D operator+ (const Vector2D & rhs) const {
      Vector2D result;
      for(int i = 0; i < nElem; i++)
        result[i] = (*this)[i] + rhs[i];
      return result;
    }
};

假设我使用-03优化,operator+的两个实现之间会有什么区别吗?我的理解是,由于默认的Vector2D构造函数没有代码体,并且类内容是默认数据类型,因此在设置其成员之前,选项2中没有用于调用result上的默认构造函数的额外开销。我希望这两者是相同的,但我不能确信我的知识。

1 个答案:

答案 0 :(得分:2)

你的方法根本不起作用。如果您希望某人能够更改nElem,则无法使用xy作为您的姓名。为什么?因为将nElem更改为3不会神奇地添加z。由于您无法对forx进行y循环,因此您对nElem的定义毫无意义。

最后,这是一个使用数字模板的教科书案例。创建一个矢量,该矢量模仿它有多少元素。

做这样的事情:

template<unsigned int LEN>
class Vector{
  double v[LEN];
public:
  Vector operator+(const Vector &o){
    Vector res;
    for (unsigned int i=0;i<LEN;++i) // with -O3 and small LEN this will be unrolled
      res.v[i]=v[i]+o.v[i];
  }
  // ... etc.
};

然后你就这样使用它:

Vector<2> my_2d_vec;
Vector<3> my_3d_vec;