1. 程式人生 > >【C++學習筆記】運算子過載(二)

【C++學習筆記】運算子過載(二)

我們回顧一下運算子過載的特點:

  1. 運算子過載函式名必須為:operator<運算子>。
  2. 運算子的過載是通過運算子過載函式來實現的。對於二元運算子過載函式,函式的引數通常為一個即右運算元,運算子的左運算元為呼叫過載函式時的物件。對於一元運算子過載函式,運算子的左運算元或右運算元為呼叫函式的物件。
  3. 運算子過載函式的返回型別:若物件進行運算後的結果型別仍為元型別,則運算子過載函式的返回型別為原型別。

引數和返回值

接下來我們要仔細講講運算子過載的引數和返回值問題。

  1. 對於某些運算子(比如+、-)來說,我們往往只需要實現其運算功能,而不希望改變運算的引數。對於任何函式引數,如果僅需要從引數中讀而不改變它,預設地應當按const引用來傳遞它。普通算術運算子和布林運算子不會改變引數,所以以const引用傳遞是使用的主要方式。當函式是一個類成員的時候,就轉換為const成員函式普通算術運算子和布林運算子不會改變引數,所以
    const引用傳遞
    是使用的主要方式。當函式是一個類成員的時候,就轉換為const成員函式。只是對於會改變左側引數的賦值運算子(像+=)和運算子‘=’,左側引數才不是常量(constant),但因為引數將被改變,所以引數仍然按地址傳遞。
  2. 應該選擇的返回值取決於運算子所期望的型別。如果運算子的效果是產生一個新值,將需要產生一個作為返回值的新物件。(這句其實有一點廢話)
  3. 所有賦值運算子改變左值。為了使得賦值結果可以用於鏈式表示式(像A=B=C),應該返回剛剛改變了的左值的引用。這裡返回值應該是一個nonconst引用。——因為這樣方便進一步計算。

關於成員函式和友元函式的選擇

下面這些原則可以幫我們確定是定義為成員函式還是友元函式:

  1. 賦值(=)、下標([])、呼叫(())和成員函式訪問的箭頭(->)等操作函式必須定義為成員函式
  2. 像賦值一樣,符合賦值操作通常應定義為成員函式。但是定義成非成員函式一般也不會出錯。
  3. 改變物件狀態或與給定的型別緊密聯絡的其他操作符,如自增、自減等通常定義為成員函式(因為其設計對自身成員的操作)
  4. 對稱的操作符,如算術運算子,相等操作符、關係操作符和位操作符,最好定義為非成員函式
    例子:
#include<iostream>
using namespace std;
class Complex
{
private:
	float real images;
public:
	Complex(float r = 0,float i = 0);
	friend Complex operator+(const Complex&,const Complex&);
	friend Complex operator-(const Complex&,const Complex &);
	Complex operator++();//定義前置運算子,括號裡沒有形參
	Complex operator++(int);//定義後置運算子,引數表中有int。
	friend Complex operator ++(Complex&);//定義友元時,要加上友元的引用
	friend Complex operator++(Complex&,int);