情況一:非靜態成員函式
c++的設計準則就是非靜態成員函式至少和一般的非靜態函式有相同的效率,因此非靜態成員函式會被改寫:
舉個例子:float point3d::magnitude3d()const
①改寫函式原型,新增乙個額外的引數this到member function中,用於提供乙個訪問管道,使得class object得以掉用該函式。
float point3d::magnitude3d(const point3d *const this) 如果是非const的就不要最前面的const。
②對內部的呼叫改為this指標來訪問:
③將成員函式重新寫成乙個外部函式,並且對其名稱進行「mangling」處理,使它在程式中獨一無二,這樣重寫或者過載都沒問題。
注意對成員變數也會進行「mangling」處理,但是如果宣告為extern "c"則會壓抑「mangling」處理。
情況二:virtual member function
ptr->normal();就會轉為(*ptr->vptr[0])(ptr);
情況三:靜態成員函式
會被轉為一般的nonmember函式呼叫,如ptr->normal();轉化為normal_7point3dsfv();原來可能為((point3d *)0)->normal();但是現在沒有了。
靜態成員函式由於沒有this指標,所以它有下面特性:
不能直接訪問class中的nonstatic members,不能被宣告為const、volatile或virtual,可以不需要類物件來呼叫。
2.virtual member functions
虛函式會出現的可能:
繼承base class宣告的virtual functions函式實體,正確拷貝到對應的slot;
新增slot,加入自己的virtual functions。
多重繼承下的虛函式
當重新賦值時,會發生指標偏移,從而指向正確的型別。此時派生類共享基類的虛指標
虛擬繼承下的虛函式
此時派生類有自己的虛指標而不共享基類的虛指標。
最好不要在乙個virtual base class中宣告nonstatic data members,如果這樣做會距離複雜的深淵越來越近。
3.函式的效能
對於函式:
void cross_product()
迴圈一百萬次
for(int i=0;i<1000000;i++)cross_product();
內聯函式無論優化與否,它的效率最高。因為它把迴圈提到外面,只計算一次。
4.指向member function的指標
貌似&point::z();都不過vs2012的編譯器。。
inline 函式
沒有區域性變數時,它會進行相應的擴充套件
inline int min(int i,int j)
呼叫時,minval=min(val1,val2);
擴充套件int __min_lv_minval;
minval=(__min_lv_minval=val1有幾個區域性變數就要擴充套件出幾個區域性變數
第四章 繼承
一 為什麼要繼承 在物件導向中我們將具有很多重複內容的類中的內容提取出來,寫成乙個單獨的類 其他類只需要繼承就能取得這些功能,同時可以在自己類中寫入獨特的自定義方法 二 繼承語法 inte ce circle nsobject 繼承是在介面中定義的 冒號後的類名是要整合的類,nsobject 是co...
第四章 物件
三個特性 身份 型別 值 每個物件都有唯一的身份來標識自己,使用內建函式id 得到。例子 usr bin env python coding utf 8 a 32 print a b a print id a id b 結果 d python27 python.exe e workp python ...
第四章 其他
sizeof和strlen 區別sizeof以位元組為單位給出資料的大小,strlen 函式以字元為單位給出字串的長度。使用strlen 函式要加 include標頭檔案。sizeof計算字元時會將標誌字串結束的不可見的空字元計算在內。定義符號常量 方法一 define name value 優點 ...