C++ 操作符

先给出一片博客。Link

传递对象:

  在定义运算符的时候,向运算符函数传递参数以及返回结果时,可供选择的方式比较有限。

关于参数的选择,主要有2种

【1】值传递  【2】 引用传递

对于大小在1~4个字长之间的小对象来说,采用值传递的方式通常是最好的选择,得到的性能也最好。但传递和使用参数的实际性能可能会受机器的体系结构等影响。

对于较大的对象,一般采用引用传递的方式。例如,对于复数矩阵Matrix,因其所占空间通常不止几个字,所以我们采用引用传递的方式:

Matrix operator+(const Matrix&, const Matrix&);//常量引用传递

尤其是,如果传入被调函数的是内容不会被修改的较大对象,则应该采用const引用的方式。

通常,一个运算符返回一个结果。想一个新建的对象返回指针或者引用基本上是一种比较糟糕的选择:使用指针会带来符号使用方面的困难,而引用自由存储上的对象(不管是使用指针还是引用)会导致资源管理困难。最好的方式是用传值方式返回对象。对于Matrix等较大的对象来说,我们应该定义移动操作以使得值传递的过程足够有效。

Matrix operator+(const Matrix&, const Matrix&)  //通过传值返回
{
  Matrix res{a};
  return res += b;  
}

请注意,如果运算符返回的是七参数对象的某一个,则改运算符能够并且通常通过引用的方式返回。例如,我们可以把Matrix的运算符 += 定义为如下形式:

Matrix& Matrix::operator+=(const Matrix& a)  //通过传引用返回
{
    if(dim[0] != a.dim[0] || dim[1] != a.dim[1])
        throw std::exception("bad Matrix += argument");
    double* p = elem;
    double* q = a.elem;
    double* end = p + dim[0]*dim[1];
    while(p != end)
        *p++ += *q++;
    return *this;
}

这一现象在被实现为成员函数的运算符中尤为普遍。

如果函数只是把对象简单的传递给另一个函数,应该使用右值引用参数(Link

原文地址:https://www.cnblogs.com/gardenofhu/p/7641414.html