復數類 complex 是一個不帶指針的類,其聲明如下:
class complex
{
public:
complex(double r=0,double i=0):re(r),im(i){}
complex& operator +=(const complex&);
double real()const{return re;}
double imag()const{return im;}private:
double re,im;
friend complex& __doapl(complex *,const complex&);
}
對以上代碼進行解釋如下:
double re,im;
對類中的數據進行聲明,即實部和虛部,類中的數據應該是private的,不能被其他類訪問到,
在c++中訪問類的私有成員變量主要通過:set/get接口,友元類,友元函數。
double real()const{return re;}
double imag()const{return im;}
函數若在類體內定義完成,則自動成為inline候選,在類體外,加inline關鍵字,則其可成為inline候選。當對程序進行編譯時,若inline候選的程序比較簡潔,編譯器會將其按照inline進行處理,若inline候選的程序比較負責,則編譯器不會將其按照inline處理。
上面的函數是常量成員函數,即,該函數不改變類中成員數據的內容,其中const的位置是在參數列表后,即在()后面,{}前面。在確定函數不改變數據內容的時候,一定要將函數寫成常量成員函數的形式,即一定要加const。因為常量類只能調用常量成員函數,若函數不加const,則常量類調用該函數的時候就會出現錯誤,因為調用非常量成員函數,會改變類的成員數據,即與常量類自相矛盾。
complex(double r=0,double i=0):re(r),im(i){}
//re(r),im(i)是對參數進行初始化
complex(double r=0,double i=0){re=r;im=i;}
//對參數進行賦值
構造函數中要盡量使用值的初始化,而不是賦值,這樣性能會更高。
構造函數也可放在類的private區域,此時使用構造函數創建類將是錯誤的,因為private不能被訪問到,即不允許外界通過構造函數創建類,單例模式即是如此。
參數傳遞和返回值傳遞,盡量選擇使用引用傳遞。因為值傳遞會將參數進行拷貝并傳遞,浪費空間,值傳遞不會改變原始數據。而引用傳遞,是參數的別名,不需要對數據進行拷貝,可提高程序的性能,引用傳遞會改變原始數據。
返回值傳遞,首先考慮引用傳遞,再考慮引用是否可行,若不可行,再選擇值傳遞。返回值傳遞時,若傳遞的數據是函數中新定義的局部變量,此時要選擇值傳遞,因為若選用引用傳遞的話,當這個類消失的時候,該函數以及其定義的局部變量均會消失,而當其局部變量作為引用傳遞的返回值依然存在時,則會出現問題。即,當一個函數進行操作后,將操作的結果在函數里新建了一個變量來保存這個結果時,這種情況就不能返回引用;當一個函數進行操作后,將操作的結果放在某個參數里進行返回的時候,可以返回引用。
操作符重載的一般格式如下:
函數類型 operator 運算符名稱 (形參列表)
{
對運算符的重載處理
}
complex& operator +=(const complex&);
此處是對 += 進行操作符重載。此處參數是const complex&,其中const表示對該參數不進行修改,即可加const。此處還包含一個隱式參數,例如,c1+=c2,調用的即為c1.operator+=(c2),此處實現為:
inline complex&
__doapl(complex* ths, const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths;
}
inline complex&
complex::operator += (const complex& r)
{
return __doapl (this, r);
}
即,c1調用operator+=函數,c1作為隱式參數,和c2調用__doapl()函數,并將最后的操作結果作為引用傳遞傳回c1。
當操作符重載不作為成員函數時,就沒有隱式參數。例如:
此處返回值是值傳遞,是因為對數據進行操作后,將返回結果保存在一個新建的變量中進行返回的,因此用值傳遞。可根據參數的不同進行重載。
complex operator +(const complex& x,const complex& y);
complex operator +(const complex& x,double y);
complex operator +(double x,const complex& y);
complex operator +(const complex& x); //例如:正號的作用
對輸出函數進行重載:
此處也是選擇非成員函數的方式,因為此時直接調用cout<<c1即可進行輸出函數。
如果選擇成員函數的形式,則調用方式則變為:c1<<cout,與常用方式不同。
返回值是ostream&的原因是:調用cout<<c1<<c2時不會出錯,另外,參數ostream& os不是const的原因是,代碼對os進行了改變。
#include <iostream.h>
ostream& operator << (ostream& os,const complex& x)
{
return os << '(' << real (x) << ','<< imag (x) << ')';
}