c++類定義代碼的分離


類文件

實際工程中,對一個類的說明、架構、描述方法是:    往往分成頭文件和實現的源文件,來實現代碼的分離

  然后,源文件中包含類的頭文件...

頭文件的包含問題:

  類對應的實現文件cpp、main主函數文件,都要包含類的頭文件,因為要“單獨”編譯;

  main函數、其他文件要使用這個類的時候,都只需要包含該類的頭文件足矣( 使用時、“編譯”時, 無非是引用該

  類的成員和方法),而這些成員和方法已經在頭文件中聲明(或定義了);

  至於具體的實現代碼,在鏈接的時候,是由linker “自動“  尋找該類對應的源文件cpp, 過程我們不必關心.

頭文件

頭文件的所有內容,都必須包含在

#ifndef {Filename}
#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相反

   static的第二種含義:修飾局部變量時,表明該變量的值不會因為函數終止而丟失。
 
   static的第四種含義:修飾類的數據成員,表明對該類所有對象這個數據成員都只有一個實例。即該實例歸 所有對象共有。
   static的第五種含義:修飾類成員函數,表明靜態成員函數

 

全局變量

全局變量是指文件中,定義在函數,類/結構外面的變量。目的是為了讓多個函數和類都可以使用這個變量

分為:

普通全局變量,它的作用域是面向整個程序域的,面向項目中的所有文件的,在鏈接階段,全局變量對所有的文件都是可見的:

  注意它不需要加任何修飾符(默認的全局變量,就是面向整個程序域的);

staitic全局變量,它的作用域被限定在本文件中,只能為這個文件中的所以函數和類使用

exten的作用:

  與C組合使用,extern C..., 表示c++項目按C語言的風格進行編譯(包括參數的傳遞順序,編譯生成函數的名稱...)

  第二種是,“只是一個聲明”,聲明當前文件中使用的這個變量是一個外部變量,我不用去定義它,但是在其他的文件有定義,當前可以大膽的使用,

    不能全都是extern,必須要有一個實際的文件中,進行這個變量的定義,否則在鏈接的時候,就不能實現當初的“承諾”而報錯

 

 

 

 

 

 http://www.cnblogs.com/johnpher/archive/2011/12/18/2570598.html

 

 

 

 

 


    

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM