快速业务通道

C++的算符重载

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
为幂运算,只是优先级和结合性是错误的。

如何为Matrix(矩阵)类创建下标运算符? [Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

用 operator()而不是operator[]。

当有多个下标时,最清晰的方式是使用operator()而不是operator[]。原因是operator[]总是带一个参数,而operator()可以带任何数目的参数(在矩形的矩阵情况下,需要两个参数)。

如:

class Matrix {
  public:
  Matrix(unsigned rows, unsigned cols);
  double& operator() (unsigned row, unsigned col);
  double operator() (unsigned row, unsigned col) const; // …
  Matrix(); // 析构函数
  Matrix(const Matrix& m); // 拷贝构造函数
  Matrix& operator= (const Matrix& m); // 赋值算符   // …
  private:
  unsigned rows_, cols_;
  double* data_;
};
inline
Matrix::Matrix(unsigned rows, unsigned cols)
: rows_ (rows),
cols_ (cols),
data_ (new double[rows * cols])
{
  if (rows == 0 || cols == 0)
  throw BadIndex("Matrix constructor has 0 size");
}
inline
Matrix::~Matrix()
{
  delete[] data_;
}
inline
double& Matrix::operator() (unsigned row, unsigned col)
{
  if (row >= rows_ || col >= cols_)
  throw BadIndex("Matrix subscript out of bounds");
  return data_[cols_*row + col];
}
inline
double Matrix::operator() (unsigned row, unsigned col) const
{
  if (row >= rows_ || col >= cols_)
  throw BadIndex("const Matrix subscript out of bounds");
  return data_[cols_*row + col];
}
   然后,你可以使用m(I,j)来访问Matrix m 的元素,而不是m[i][j]:
int main()
{
  Matrix m(10,10);
  m(5,8) = 106.15;
  std::cout << m(5,8);  // …
}

为什么Matrix(矩阵)类的接口不应该象数组的数组?本FAQ其实是关于:某些人建立的Matrix 类,带有一个返回 Array 对象的引用的operator[]。而该Array 对象也带有一个 operator[] ,它返回Matrix的一个元素(例如,一个double的引用)。因此,他们使用类似m[i][j]的语法来访问矩阵的元素,而不是象m(I,j)的语法。

数组的数组方案显然可以工作,但相对于operator()方法来说,缺乏灵活性。尤其是,用[][]方法很难表现的时候,用operator()方法可以很简单的完成,因此[][]方法很可能导致差劲的表现,至少某些情况细是这样的。

例如,实现[][]方法的最简单途径就是使用作为密集矩阵的,以以行为主的形式保存(或以列为主,我记不清了)的物理布局。相反,operator() 方法完全隐藏了矩阵的物理布局,在这种情况下,它可能带来更好的表现。

可以这么认为:operator()方法永远不比[][]方法差,有时更好。

operator() 永远不差,是因为用operator()方法实现以行为主的密集矩阵的物理布局非常容易。因此,当从性能观点出发,那样的结构正好是最佳布局时,operator()方法也和[][]方法一样简单(也许operator()方法更容易一点点,但我不想夸大其词)。 Operator() 方法有时更好,是因为当对于给定的应用,有其它比以行为主的密集矩阵更好的布局时,用 operator() 方法比[][]方法实现会容易得多。 作为一个物理布局使得实现困难的例子,最近的项目发生在以列访问矩阵元素(也就是,算法访问一列中的所有元素,然后是另一列等),如果物理布局是以行为主的,对矩阵的访问可能会“cache失效”。例如,如果行的大小几乎和处理器的cache大小相当,那么对每个元素的访

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号