轉 html
http://www.cnblogs.com/BlogNetSpace/archive/2009/02/12/1388943.htmlc++
http://man.chinaunix.net/develop/c&c++/c/c.htm#_Toc520634042編程
http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/headers/設計模式
目錄:ide
一、頭文件的include兩個格式函數
二、頭文件的條件編譯ui
三、頭文件依賴:前置聲明this
四、頭文件包含類容google
一、頭文件的include兩個格式spa
1.一、#include <....h> 這種格式用來引用標準庫的頭文件,編譯器默認從標準庫開始搜索
1.二、#include "......h" 這種格式用來引用非標準庫的頭文件,編譯器默認從工程當前目錄開始搜索
二、頭文件#define保護。即全部頭文件應該使用#define進行保護,防止頭文件被多重包含。就涉及到條件編譯:
#ifndef, #def, #endif,#ifdef,#define
2.一、條件編譯命令
#ifdef MY_HEADER_H // 若是定義了MY_HEADER_H,就編譯程序段1
程序段1;
#else //不然就編譯程序段2
程序段2;
#endif
#else 部分也能夠沒有:
#ifdef
code1;
#endif
這個也能夠用在某些功能文件未實現以前和實現以後使用這個條件編譯命令起到開關功能。也能夠用在調試功能上。在調試階段須要輸出一些類容,不是調試階段就不輸出。固然在調試的時候定義
#define DEBUG 1 或者 #define DEBUG 0
這樣在調試以前加這一句,就能夠在調試的時候輸出cout的內容,當不須要調試的時候,就將這個#define語句刪掉,這樣,就能正常執行程序的功能,不用輸出調試語句,這個很方便,就不用本身去刪掉或註釋掉較多的輸出語句。不錯的功能
#ifdef DEBUG
cout<<"the debug phase"<<endl;
#endif
2.二、另一種跟1比較類似,可是是反着的。
#ifndef DEBUG
code1;
#else
code2;
#endif
解釋:相對ifdef來講,中間多了一個n,表示沒有。就是若是沒有定義DEBUG,編譯code1,不然編譯coude2
#ifndef MY_HEADER_H
#define MY_HEADER_H
.....
....
....
...
...
#endif
這個是爲了防止MY_HEADER_H被重複包含。全部頭文件都應該使用 #define 防止頭文件被多重包含
2.三、另一種形式,也能夠用到code裏面,就是code裏面嵌入這個條件編譯,這樣就不用編譯所有:
#if 表達式
code1;
#else
code2;
#endif
表示若是表達式爲真,就編譯code1,不然編譯code2.
3 頭文件依賴
對於頭文件依賴,能用前置聲明的儘可能不使用#include。又涉及到了前置聲明
3.1 前置聲明(前向聲明):
class Screen;
在程序中引入類類型,在聲明以後,定義以前,類是一個不徹底類型,即知道該類是一個類型,可是並不知道包含哪些成員。只能以有限的方式使用。只要類名一出現,就認爲該類已經聲明。
class B; class A{ public: B *b; }; class B{ public: ....; ....; };
對於B來講,就是一個前置聲明,A要用到B,可是B不在A以前定義,A要使用B就要先聲明B。
轉
http://blog.csdn.net/raodotcong/article/details/6431502
http://patmusing.blog.163.com/blog/static/135834960201038113714199/
第一個博客裏面寫的是:類h文件引用其餘文件的類的時候,能夠不用引入頭文件,直接先聲明須要引用的類名,而是在類實現文件裏面引用其餘類的h文件。這樣就避免了一個頭文件包含了其餘的頭文件,減小了這個文件對其餘頭文件的依賴。由於若是一個頭文件改變,就會致使全部包含這個頭文件的代碼被從新編譯。因此儘可能在頭文件少包含其餘的頭文件,能夠選擇在cpp文件裏面包含其餘的頭文件,由於在cpp文件裏面須要引用到其餘類定義的成員,這個時候就必須先進行引用其餘類的頭文件。只是在實現文件cpp文件裏面包含其餘的頭文件是比較好的編程風格。
包含:若是你的類是其餘類的子類, 或者含有類型爲其餘類的非靜態數據成員(對象), 則必須包含其餘類所在的頭文件.
四、頭文件包含類容
頭文件通常包含類的聲明,extern變量的聲明和函數的聲明。
定義只有一次,聲明能夠屢次。
4.1 頭文件用於聲明,而不是用於定義
extern int ival = 10;//初始化,爲定義
double fica;//沒有extern,也是一個定義
沒有extern,同一個程序中兩個以上文件含有上述任一個定義都會連接錯誤。
由於頭文件包含在多個源文件,因此不該該含有變量或函數的定義。
較好的:extern double fical;
頭文件能夠包含:定義類,值在編譯的時候就知道value的const對象,inline函數。
4.2 一些const對象定義在頭文件中
若是const變量是由常量表達式初始化,就定義在頭文件,若是不是,就不要放頭文件,同時在以前加上extern以便其餘文件共享。
4.3 頭文件中能夠包括:用戶構造的數據類型(如枚舉類型),外部變量,外部函數、常量和內聯函數等具備必定通用性或經常使用的量。
而通常性的變量和函數定義不宜放在頭文件中。
(下面的圖片時轉的:http://blog.sina.com.cn/s/blog_6db80bb101013ute.html)
轉:http://www.weixueyuan.net/view/5834.html
總結:(C++primer:c++是一種靜態類型語言:變量和函數在使用前必須先聲明。變量能夠聲明屢次可是隻能定義一次)
轉的總結:http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/headers/
下面時之後要概括的一些東西,一一寫下來:
const專題,static, extern專題,class和struct區別專題,指針專題,讀寫文件專題,string專題,虛函數專題(涉及到重載,覆蓋(至關於重寫)),內聯函數專題, this指針, 析構函數,複製函數,賦值函數,初始化問題,設計模式