c++項目結構規範

頭文件(.h):
寫類的聲明(包括類裏面的成員和方法的聲明)、函數原型、#define常數等,但一般來說不寫出具體的實現。

在寫頭文件時需要注意,在開頭和結尾處必須按照如下樣式加上預編譯語句(如下):

#ifndef CIRCLE_H
#define CIRCLE_H

//你的代碼寫在這裏

#endif
 
這樣做是爲了防止重複編譯,不這樣做就有可能出錯。

至於CIRCLE_H這個名字實際上是無所謂的,你叫什麼都行,只要符合規範都行。原則上來說,非常建議把它寫成這種形式,因爲比較容易和頭文件的名字對應。
**至於.h和.cpp具有同樣的主文件名的情況呢,對編譯器來講是沒有什麼意義的,編譯器不會去匹配二者的主文件名,相反它很傻,只認#include等語句。但是這樣寫是一種約定俗成的編程風格,一個類的名字作爲其頭文件和源文件的主文件名比如Class1.h和Class1.cpp,這個類的聲明在Class1.h中,實現在Class1.cpp中,我們人類看起來比較整齊,讀起來方便,也很有利於模塊化和源代碼的重用。
**

爲什麼這個風格會約定俗成?有一句著名的話,叫“程序是爲程序員寫的”。

源文件(.cpp):

源文件主要寫實現頭文件中已經聲明的那些函數的具體代碼。需要注意的是,開頭必須#include一下實現的頭文件,以及要用到的頭文件。那麼當你需要用到自己寫的頭文件中的類時,只需要#include進來就行了。

下面舉個最簡單的例子來描述一下,咱就求個圓面積。

 第1步,建立一個空工程(以在VS2003環境下爲例)。

 第2步,在頭文件的文件夾裏新建一個名爲Circle.h的頭文件,它的內容如下:

#ifndef CIRCLE_H
#define CIRCLE_H

class Circle
{
private:
   double r;//半徑
public:
   Circle();//構造函數
   Circle(double R);//構造函數
   double Area();//求面積函數
};

#endif

注意到開頭結尾的預編譯語句。在頭文件裏,並不寫出函數的具體實現。

第3步,要給出Circle類的具體實現,因此,在源文件夾裏新建一個Circle.cpp的文件,它的內容如下:

#include "Circle.h"

Circle::Circle()
{
   this->r=5.0;
}

Circle::Circle(double R)
{
   this->r=R;
}

double Circle:: Area()
{
   return 3.14*r*r;
}
需要注意的是:開頭處包含了Circle.h,事實上,只要此cpp文件用到的文件,都要包含進來!這個文件的名字其實不一定要叫Circle.cpp,但非常建議cpp文件與頭文件相對應。

最後,我們建一個main.cpp來測試我們寫的Circle類,它的內容如下:

#include <iostream>
#include "Circle.h"
using namespace std;

int main()
{
    Circle c(3);
    cout<<"Area="<<c.Area()<<endl;
    return 1;
}
注意到開頭時有#include "Circle.h"的聲明,證明我們使用到了我們剛纔寫的Circle類。

說明我們寫的Circle類確實可以用了。

1…h叫做頭文件,它是不能被編譯的。“#include”叫做編譯預處理指令,可以簡單理解成,在1.cpp中的#include"1.h"指令把1.h中的代碼在編譯前添加到了1.cpp的頭部。每個.cpp文件會被編譯,生成一個.obj文件,然後所有的.obj文件鏈接起來你的可執行程序就算生成了。

發現了沒有,你要在.h文件中嚴格區分聲明語句和定義語句。好的習慣是,頭文件中應只處理常量、變量、函數以及類等等等等的聲明,變量的定義和函數的實現等等等等都應該在源文件.cpp中進行。

2.h文件和cpp文件也就是說,在h文件中聲明Declare,而在cpp文件中定義Define。 “聲明”向計算機介紹名字,它說,“這個名字是什麼意思”。而“定義”爲這個名字分配存儲空間。無論涉及到變量時還是函數時含義都一樣。無論在哪種情況下,編譯器都在“定義”處分配存儲空間。對於變量,編譯器確定這個變量佔多少存儲單元,並在內存中產生存放它們的空間。對於函數,編譯器產生代碼,併爲之分配存儲空間。函數的存儲空間中有一個由使用不帶參數表或帶地址操作符的函數名產生的指針。定義也可以是聲明。如果該編譯器還沒有看到過名字A,程序員定義int A,則編譯器馬上爲這個名字分配存儲地址。聲明常常使用於extern關鍵字。如果我們只是聲明變量而不是定義它,則要求使用extern。對於函數聲明, extern是可選的,不帶函數體的函數名連同參數表或返回值,自動地作爲一個聲明。

另篇:

在C++編程過程中,隨着項目的越來越大,代碼也會越來越多,並且難以管理和分析。於是,在C++中就要分出了頭(.h)文件和實現(.cpp)文件,並且也有了Package的概念。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章