Time of Update: 2018-12-04
對簡單對象來說,記憶體結構布局很簡單,遵循以下描述:1、非待用資料成員是影響對象所佔據記憶體大小的主要因素,隨著對象的增加而增加;2、所有對象共用一份待用資料成員,用sizeof計算對象大小時不會包含待用資料成員佔據記憶體的大小;3、靜態成員函數和非靜態成員函數不影響對象記憶體的大小;4、如果對象中包含虛函數,會增加4位元組的空間用來儲存虛函數表指標。 對單繼承類,遵循如下描述:在衍生類別執行個體頭部存在一個基類執行個體,虛函數表與基類公用一個。基類的記憶體布局和簡單對象的記憶體布局一樣,衍生類
Time of Update: 2018-12-04
記憶體對齊。對下面的類: class B{ public:int m_a; short int m_b; double m_c private: int m_d; public: int GetValue(){ return m_c; }
Time of Update: 2018-12-04
最近做一個項目,使用了一個抽象類別的線程類,使用的時候發現有時會出現調用純虛函數的情況,代碼如下:class Thread{public:Thread(int InitFlag=CREATE_SUSPENDED);~Thread();HANDLE m_ThreadHdl;private:virtual bool Execute()=0;static unsigned __stdcall threadPro( LPVOID pParam);};Thread::Thread(int
Time of Update: 2018-12-04
背景Google的開源項目大多使用C++開發。每一個C++程式員也都知道,C++具有很多強大的語言特性,但這種強大不可避免的導致它的複雜,這種複雜會使得代碼更易於出現bug、難於閱讀和維護。本指南的目的是通過詳細闡述在C++編碼時要怎樣寫、不要怎樣寫來規避其複雜性。這些規則可在允許代碼有效使用C++語言特性的同時使其易於管理。風格,也被視為可讀性,主要指稱管理C++代碼的習慣。使用術語風格有點用詞不當,因為這些習慣遠不止原始碼檔案格式這麼簡單。使代碼易於管理的方法之一是增強代碼一致性,讓別人可以
Time of Update: 2018-12-04
範圍1. 命名空間(Namespaces)在.cc檔案中,提倡使用不具名的命名空間(unnamed namespaces,譯者註:不具名的命名空間就像不具名的類一樣,似乎被介紹的很少:-()。使用具名命名空間時,其名稱可基於項目或路徑名稱,不要使用using指示符。定義:命名空間將全域範圍細分為不同的、具名的範圍,可有效防止全域範圍的命名衝突。優點:命名空間提供了(可嵌套)命名軸線(name
Time of Update: 2018-12-04
關於類的注意事項,總結一下:1. 不在建構函式中做太多邏輯相關的初始化; 2. 編譯器提供的預設建構函式不會對變數進行初始化,如果定義了其他建構函式,編譯器不再提供,需要編碼者自行提供預設建構函式;3. 為避免隱式轉換,需將單參數建構函式聲明為explicit;……類類是C++中基本的代碼單元,自然被廣泛使用。本節列舉了在寫一個類時要做什麼、不要做什麼。 1.
Time of Update: 2018-12-04
公司今天對我們進行技能考核,本人覺得非常無聊!裡面居然有一個可以被稱為古董的問題:如何使用c++程式查看作業系統的位元(16 位 or 32位),不能使用sizeof()函數 這個問題本身好像就是一個非常複雜的問題,程式去查看作業系統的位元,我個人覺得應該是一個很高深的問題,在Windows下應該有相應的API函數的。不知道不同版本的編譯器對是怎樣來進行處理這個問題的。我在試題上的原始碼:#include <iostream>#include
Time of Update: 2018-12-04
4 類 4.1 類的設計 類是物件導向設計的基礎,一個好的類應該職責單一,介面清晰、少而完備,類間低耦合、類內高內 聚,並且很好地展現封裝、繼承、多態、模組化等特性。 原則4.1 類職責單一 說明:類應該職責單一。如果一個類的職責過多,往往難以設計、實現、使用、維護。 隨著功能的擴充,類的職責範圍自然也擴大,但職責不應該發散。 用小類代替巨類。小類更易於編寫,測試,使用和維護。用小類體現簡單設計的概念;巨類會削弱封
Time of Update: 2018-12-04
5 範圍、模板和C++其他特性 5.1 範圍 原則5.1 使用名字空間進行歸類,避免符號衝突 說明:名字空間主要解決符號衝突問題。 樣本:兩個不同項目的全域範圍都有一個類 Foo, 這樣在編譯或運行時造成衝突。如果每個項目將 代碼置於不同名字空間中 namespace project1 { class Foo; //… } namespace project2 { class Foo;
Time of Update: 2018-12-04
7 異常與錯誤處理 7.1 異常 異常是C++語言的一個強大特性,在正確使用之前需要深入瞭解,以及使用異常代碼的上下文。 原則7.1 減少不必要的異常 說明:異常對編碼技能要求更高,使用中容易出錯,首先從安全性角度考慮,盡量少用或者不用異常。 相比返回錯誤,異常的優點: 異常可以集中捕捉,錯誤偵測與演算法處理相分離,演算法邏輯更清晰;而返回錯誤在每個返回點都 要進行檢測與錯誤處理,代碼邏輯分散。
Time of Update: 2018-12-04
1 常量 不變的值更易於理解、跟蹤和分析,所以應該儘可能地使用常量代替變數,定義值的時候,應該把const 作為預設的選項。 規則1.1 使用const常量取代宏 說明:宏是簡單的文本替換,在預先處理階段時完成,運行報錯時直接報相應的值;跟蹤調試時也是顯 示值,而不是宏名;宏沒有類型檢查,不安全;宏沒有範圍。 樣本: #define MAX_MSISDN_LEN (20) //不好的例子 const int MAX_MSISDN_LEN = 20; //好的例子 規則1.2
Time of Update: 2018-12-04
2 初始化和類型轉換 2.1 聲明、定義與初始化 規則2.1 禁止用memcpy、memset初始化非POD對象 說明:POD 全稱是“Plain Old Data”,是C++ 98標準(ISO/IEC 14882, first edition, 1998-09-01)中引入的一個概念, POD類型主要包括int, char, float,double,enumeration,void,指標等原始
Time of Update: 2018-12-04
8 標準庫 STL標準模板庫在不同產品使用程度不同,這裡列出一些基本規則和建議,供各團隊參考。 規則8.1 避免使用auto_ptr 說明:在stl庫中的std::auto_ptr具有一個隱式的所有權轉移行為,如下代碼: auto_ptr<T> p1(new T); auto_ptr<T> p2 = p1; 當執行完第2行語句後,p1已經不再指向第1行中分配的對象,而是變為NULL。正因為如此,auto_ptr 不能被置於各種標準容器中。
Time of Update: 2018-12-04
__declspec(dllexport)與.def檔案在VC++中,如果產生DLL可以不使用.def檔案。只需要在VC++的函數定義前要加__declspec(dllexport)修飾就可以了。但是使用__declspec(dllexport)和使用.def檔案是有區別的。如果DLL是提供給VC++使用者使用的,只需要把編譯DLL時產生的.lib提供給使用者,它可以很輕鬆地調用你的DLL。但是如果DLL是供VB、PB、Delphi使用者使用的,那麼會產生一個小麻煩。因為VC++對於__dec
Time of Update: 2018-12-04
There are many facets of the spirit of C, but the essence is a community sentiment of the underlying principles upon which the C language is based ( C Rationale Introduction ) .1.Trust the programmer . 相信程式員。2. Keep
Time of Update: 2018-12-04
/*竊以為好的程式能在各種編譯器中運行,故代碼編寫者需謹慎,並瞭解某些真相!*/int main(){int a=42;printf("%d\n",a);}上面的小程式有什麼問題呢?你能想起幾條來呢?加上以下幾點才是接近“正確的”的C程式。1.#include<stdio.h>2.return 0;程式啟動並執行結果是:在螢幕上列印42,並換行。其實,上述兩條修改之外,還可以有所改進的-----3. int main(void)再看下面的小程式:#include<stdio.
Time of Update: 2018-12-04
C++批判的批判 1,typedef不必要?a,typedef提供了一層間接,物件導向語言中,介面掩蓋了運行時不同具體類型間的差別,而typedef掩蓋了編譯時間不同類型間的差別,卻又不喪失型別安全b,一般語言只能返回“值”,而typedef提供了返回“類型”的能力,這是模板元編程不可或缺的機制,除非模板元編程眼下也是不必要的2,匯入在不同地點分別對#include,private成員放在標頭檔中,inline函數也放在標頭檔中進行了批判,實際上原因只有一個:C++不是平台,它沒有二進位標準,
Time of Update: 2018-12-04
shell的輸入與輸出主要包括:echo命令read命令cat命令管道tee命令標準輸入、輸出和標準錯誤重新導向echo [-e] [-n] stringstring : 字串,可以含 shell 變數、轉義符等, 一般用雙引號括起來-e : 讓 echo 解釋 string 中的轉義符-n : 禁止 echo 輸出後輸出 NEWLINE(換行)cat [-n][-b][-t][-e] file1 file2 ...cat
Time of Update: 2018-12-04
編譯預先處理三種預先處理命令1.宏定義2.包含檔案 #include3.條件編譯定義 #define S(a,b) a*b引用 S(a+c,b+c)展開 a+c*b+c條件編譯#define DEBUG //調試版本,在發布版本中把這句刪除,那麼程式中調試部分不會起作用情況一:#if常量運算式 程式段1#else 程式段2#endif情況二:#ifef 標識符 //是否已經定義 程式段1#else 程式段2#endif常見:#ifdef
Time of Update: 2018-12-04
1.C++的虛函數是怎樣實現的?