標籤:target except ret 對象 double 關於 基本 複數 while
先給出一片部落格。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)。
C++ 操作符