類文件
實際工程中,對一個類的說明、架構、描述方法是: 往往分成頭文件和實現的源文件,來實現代碼的分離
然后,源文件中包含類的頭文件...
頭文件的包含問題:
類對應的實現文件cpp、main主函數文件,都要包含類的頭文件,因為要“單獨”編譯;
main函數、其他文件要使用這個類的時候,都只需要包含該類的頭文件足矣( 使用時、“編譯”時, 無非是引用該
類的成員和方法),而這些成員和方法已經在頭文件中聲明(或定義了);
至於具體的實現代碼,在鏈接的時候,是由linker “自動“ 尋找該類對應的源文件cpp, 過程我們不必關心.
頭文件
頭文件的所有內容,都必須包含在
#define {Filename}
//{Content of head file}
#endif
這樣才能保證頭文件被多個其他文件引用(include)時,內部的數據不會被多次定義而造成錯誤
inline限定符
在頭文件中,可以對函數用inline限定符來告知編譯器,這段函數非常的簡單,可以直接“ 嵌入“ 到調用定義之處。
當然inline的函數並不一定會被編譯器作為inline來實現,如果函數過於復雜,編譯器也會拒絕inline。
因此簡單說來,代碼最好短到只有3-5行的才作為inline。有循環,分支,遞歸的函數都不要用做inline。
對於在類定義內定義實現的函數,編譯器自動當做有inline請求(也是不一定inline的)。
函數成員
函數成員無論是否帶有static限定符,其申明都放在.h文件的類定義內部。
對於要inline的函數成員其定義放在.h文件;其他函數的實現都放在.cpp文件中。
數據成員
數據成員的申明與定義都是放在.h文件的類定義內部。對於數據類型,關鍵問題是其初始化要放在什么地方進行。
對於只含有static限定符的數據成員,它的初始化要放在.cpp文件中。因為它是所有類對象共有的,因此必須對它做合適的初始化。
對於只含有const限定符的數據成員,它的初始化只能在構造函數的初始化列表中完成。因為它是一經初始化就不能重新賦值,因此它也必須進行合適的初始化。
對於既含有static限定符,又含有const限定符的數據成員,它的初始化和定義同時進行。它也是必須進行合適的初始化
對於既沒有static限定符,又沒有const限定符的數據成員,它的值只針對本對象可以隨意修改,因此我們並不在意它的初始化什么時候進行。
模板的定義
因為模板的這種特殊性,它並沒有自己的准確定義,因此我們不能把它放在.cpp文件中,而要把他們全部放在.h文件中進行書寫。這也是為了在模板具體化的時候,能夠讓編譯器可以找到模板的所有定義在哪里,以便真正的定義方法。
類定義語句
類定義是一種類型定義語句,后面要加分號,這里的{ }跟if,for等語法結構中的大括號不同
一開始寫class clsName的時候就在{ }后面加上;分號
類里面的static,const修飾符
1. 類的成員函數
static修飾成員函數,表示:該成員函數邏輯上屬於類;而且表示它只能操作靜態數據成員、全局變量、自己的參數,
由於屬於類, 沒有this指針, 所以它不會去操作 “非靜態“ : 數據成員: 非靜態成員函數(“非靜態”的東西,必須要具體的對象、this去調用)
const修飾成員函數:表示:該成員函數不會修改類對象的非靜態數據成員
**** 對於類的成員函數而言, static和const是不能同時修飾類的成員函數的: 因為const函數隱含包含一個實例指針:const this * , 這與static相矛盾 ***********
2. 類的數據成員
static成員的作用類似於global變量,但要優於全局變量
2.1 static類成員變量,在類的內部叫 “聲明”(static表示聲明),在類的外部A::a=1; 叫賦值, 要定義必須加類型和賦值:int A::a=1; 這個才叫做定義
,這時不能加static,因為現在是定義而不是聲明了
2.2 const類成員變量,只能在類的構造函數的初始化列表中初始化(只是對某個具體的對象而言,恆定不變)
2.3 要想在整個類中都建立恆定的常量,得使用: static const int a; = == == = =const static int a; (const, static 的位置不限), 它的定義跟2.1類似:
cpp文件中: const int A::a=1; (同樣的,不要加static)
----;或者使用枚舉常量:
- class Test
- {
- public:
- Test():a(0){}
- enum {size1=100,size2=200};
2.4 只有一類數據成員可以在類中初始化:靜態整型成員常量(整型並不只有int,char等也是)
static const int a = 0; //Ok
static const char b = 0; //Ok
static const double c = 0; //Error
static const double d; //在類的定義(.h文件中)中聲明一個變量
static const double d = 0; //在類的成員的定義中(.cpp文件中)定義在.h中聲明的靜態成員常量
還有一些規則可能因編譯器不同而有所不同
static的五種含義
static的第一種含義:修飾全局變量時,表明一個全局變量只對定義在同一文件中的函數可見。
static的第三種含義:修飾全局函數時,表明該函數只在同一文件中調用。 ==與extern相反
全局變量
全局變量是指文件中,定義在函數,類/結構外面的變量。目的是為了讓多個函數和類都可以使用這個變量
分為:
普通全局變量,它的作用域是面向整個程序域的,面向項目中的所有文件的,在鏈接階段,全局變量對所有的文件都是可見的:
注意它不需要加任何修飾符(默認的全局變量,就是面向整個程序域的);
staitic全局變量,它的作用域被限定在本文件中,只能為這個文件中的所以函數和類使用
exten的作用:
與C組合使用,extern C..., 表示c++項目按C語言的風格進行編譯(包括參數的傳遞順序,編譯生成函數的名稱...)
第二種是,“只是一個聲明”,聲明當前文件中使用的這個變量是一個外部變量,我不用去定義它,但是在其他的文件有定義,當前可以大膽的使用,
不能全都是extern,必須要有一個實際的文件中,進行這個變量的定義,否則在鏈接的時候,就不能實現當初的“承諾”而報錯
http://www.cnblogs.com/johnpher/archive/2011/12/18/2570598.html