先给出一片博客。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)。