日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++面向对象高级编程 学习一 不带指针的类

發布時間:2023/12/13 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++面向对象高级编程 学习一 不带指针的类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

復數類 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) << ')'; }

總結

以上是生活随笔為你收集整理的c++面向对象高级编程 学习一 不带指针的类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。