1.禁止使用memcpy memset 初始化非pod物件
pod(plain old data)主要包括 int,char,float,double,enum,void,指標等原始型別和其集合。
非pod型別,可能含有虛函式,導致記憶體布局不確定,使用memset可能會帶來問題。比如示例
memset(this, 0, sizeof(this));
在這個**中,將虛函式表指標vptr置為空,呼叫空指標,程式會異常退出。
2.變數使用時才宣告並初始化
避免了使用變數時未賦初值的錯誤。
節省資源和方便**閱讀。因為一開始就宣告並且初始化一堆預設值,是對資源的浪費,程式及有可能提前退出,而且不方便閱讀,看個**總是要拉到函式開始處去看變數初始值。
3.避免建構函式中過於複雜的初始化
一般建議僅僅在建構函式中做值的初始化,複雜的構造放在init函式中進行,以下幾種情況尤其推薦使用init函式
4.初始化列表要嚴格按照成員宣告的順序進行編寫
因為編譯器會按照資料成員在類中的宣告順序進行初始化,而不是初始化列表的順序,主要是為了避免理解混淆和順序依賴的bug。
class employee ;
private:
string email_, firstname_, lastname_;
};
c 宣告 定義 初始化
簡述 語言型別 物件 變數 型別是乙個抽象,規定物件的時空排布 物件是乙個實體。具有屬性和方法 操作 物件屬性和方法,是否可見,可索引,可修改。變數是實體名稱或者容器名稱,總之是個名稱。介於抽象模型和物理實現之間。c中應該是編譯器為物件方法屬性等所分配的具有空間時間特性的記憶體的名字。工具編譯器 預...
C 宣告 定義 初始化
告訴編譯器某個東西的名稱和型別,但略去細節,比如 extern int x 物件object宣告 std size t numdigits int number function宣告 class widget class宣告 templateclass graphnode 模板template宣告函...
初始化 賦值 宣告 定義
初始化和賦值是兩個完全不同的操作 列表初始化 用花括號 來初始化變數,列表初始化下,如果損失精度會編譯錯誤,正常初始化則是warning 常見初始化方法 int a 1 int b int c 3 int d double e int f e warning int g error 預設初始化 定義...