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
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
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
11風格 11.1 標示符命名與定義 建議11.1 類命名以大寫字母開頭,中間單詞也以大寫開頭 樣本: class UrlTable; class UrlTableProperties; 11.2 排版 建議11.2 類的聲明按照一定的次序進行,關鍵字不縮排 說明:類的聲明按照一定的次序和規範進行。建議的次序如下: 按照存取控制特性段排序:public、protected、private,如果沒有可以忽略。這個排序是讓聲
Time of Update: 2018-12-04
【線程的概念】為了瞭解線程的概念,我們必須先討論一下進程的概念。 一個進程通常定義為程式的一個執行個體。在Win32中, 進程佔據4GB的地址空間。與它們在MS-DOS和16位Windows作業系統中不同, Win32進程是沒有活力的。這就是說,一個Win32進程並不執行什麼指令,它只是佔據著4GB的地址空間,此空間中有應用程式EXE檔案的
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
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
編程風格指南的使用要點在於提供一個公用的編碼規範,所有人可以把精力集中在實現內容而不是表現形式上。我們給出了全域的風格規範,但局部的風格也很重要,如果你在一個檔案中新加的代碼和原有代碼風格相去甚遠的話,這就破壞了檔案本身的整體美觀也影響閱讀規則之例外前面說明的編碼習慣基本是強制性的,但所有優秀的規則都允許例外。 1. 現有不統一代碼(Existing Non-conformant
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
Linux下C開發編輯器:VI編譯器:選擇GNU C/C++編譯器gcc調試器:應用廣泛的gdb函數庫:glibc系統標頭檔:glibc_header若想開發圖形介面,還需選上GNOME(c)/KDE(c++)軟體開發IDE:(大多數人還是直接使用gcc)Kylix:號稱Linux下的DephiKdevelopRHIDE:類似Turbo 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
話說總結下C檔案編譯過程.首先假設有這麼一段經典C程式:#include <stdio.h>int main(){printf("hello\n");return 0;}首先將上述程式儲存為標準的ASCII文字檔hello.c.於是乎編譯之,系統開始這麼處理:前置處理器開始介入,對該檔案進行預先處理,也即文本替換,把#後面的一大堆替換掉,比如上面那程式中第一行的#include
Time of Update: 2018-12-04
1.C++的虛函數是怎樣實現的?