[size=medium][b]建議55:地方物件切片[/b][/size]
1、定義:
c++記憶體模型規定,如果出現繼承結構,記憶體分布一定是先基類部分的資料,後派生類部分的資料。在派生類向基類對映的過程中,派生類的物件中基類部分的資料會被強行「切」掉。
2、注意:
多型的事先必須依靠指向同一類族的指標或是引用。否則,就可能出現著名的物件切片問題。所以,在既有繼承又有虛函式的情況下,一定要地方物件切片。
3、**示例
#include
#include
using namespace std;
class bird
// 虛函式
virtual string feature() const
protected:
string m_name;
};class parrot : public bird
virtual string feature() const
private:
string m_food;
};// 預設的
void describebird(bird bird)
// 引用版
/*void describebird(bird& bird)
*///指標版
/*void describebird(bird* bird)
*/int main()
建議56:在正確的場合使用恰當的特性
主要分析c++針對c的高階特性的代價,我們要恰當的使用它們,提高效率;
1)虛函式
虛函式機制的實現是通過虛函式表和指向虛函式表的指標來完成;
他是c++中眾多執行時多型特性中開銷最小的、最常用的機制,
a、因為在程式中每個類只有乙個虛函式表的拷貝,所以它占用的空間不是很大;
b、在時間方面, 虛函式的呼叫開銷包括兩次整型加法的開銷和一次指標間接引用的開銷;
2)多重繼承
針對於虛函式來說,物件內部有多個指標;
3)虛基類
虛基類與多重繼承的情況一樣,因為虛基類是為了多重繼承而產生的,物件內部處理插入積累函式的指標外,還插入虛基類指標;
建議57: 將資料成員宣告為private
1)用private修飾成員變數,可讓資料成員隱藏起來,通過資料成員的getter和settr來實現訪問控制,這樣可以更加精確的控制成員可讀性;
2)將資料成員隱藏於功能性的介面中,其實是為我們預留了以後改變實現決策的權利,並為以後的各種實現提供了彈性;
3)保持語法的一致性
堅持這一原則,我們就不必要在訪問類成員方式的問題上再糾結而消耗時間;
改善c 程式建議 其他
1 c 編寫死迴圈一般使用 while 1 2 關鍵字static有三個明顯的作用 1 在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。2 在模組內 但在函式體外 乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。3 在模組內,...
改善C 程式的157個建議(1)
2.使用預設轉型方法 3.區別對待強制轉型與as和is 1 避免裝箱 什麼是裝箱?指將乙個值型別隱式的轉換為object型別。裝箱為什麼會帶來效能損耗?因為它需要完成下面三個步驟 1 會為值型別在託管堆中分配記憶體。除了使用值型別本身所分配的記憶體空間外,記憶體總量還要加上型別物件指標和同步塊索引所...
改善C 程式 的N個建議 6 10
建議6 分清readonly和const的使用方法.首先區分他們的各自特點.readonly 執行時常量.const 編譯期常量 決定了它肯定是靜態的 只能修飾基元型別 string 也是屬於基元型別 和列舉型別.或許有人會問了,執行時常量和編譯期常量有什麼區別呢?那就先看一下 片段 public ...