類定義和類實現的分離
類定義就是指定義類名,類的數據域和類里面的函數。只是定義而不去實現。這一概念有點像是java中接口的概念,是被當做一個約束和標准去使用的。類定義的文件是.h文件。
類實現是指對類定義的具體實現,即完成函數內部的代碼。類實現的文件是一個.cpp文件。
類定義和類實現的文件名是一樣的,但是擴展名不同。
那么我們為什么要將定義和實現分離?自然是有很多好處的,可以參見下面這篇博客:
我舉一個最簡單的例子。假如你在做一個很大的項目,每個人負責項目的一個小部分,最后一個部分調用另一個部分的函數,完成整個項目的實現。在這個過程中,你就需要查看別的同事寫了什么函數,函數的功能是怎樣的。如果我們不把定義和實現分離,閱讀量是很大的。但是分離之后,我們只需要看類定義(.h文件)即可知道這個類有什么函數。對於函數的功能,我們可以通過閱讀注釋來獲得。所以在類定義的時候,一定要用注釋說明每個屬性和函數代表的意義或實現的功能。
下面就來具體的說明一下如何做定義和實現。
首先是類的定義,我們實現一個Circle.h頭文件來定義圓這個類。
先來說一下怎么添加Circle.h文件吧。我用了一個比較笨的辦法(使用的IDE是CodeBlocks),現在項目的同目錄下新建一個文本文檔,然后改名為Circle.h。
然后打開CodeBlocks,右鍵你的項目名,單擊Add files...(我的已經添加進去了,下邊Headers那個目錄就是)
然后選中你要添加的文件,點擊打開,然后確定即可。
接下來我們就可以編輯這個.h文件了。
下面是Circle.h文件的內容:
#ifndef CIRCLE_H
#define CIRCLE_H
//上面的意思是防止重復包含
class Circle { public: //圓的半徑 double radius; //無參構造函數 Circle(); //有參構造函數 Circle(double); //獲取圓的面積 double getArea(); };
#endif
然后是類實現的Circle.cpp文件,添加的方法同上,這里不過多贅述。直接給出Circle.cpp文件
#include "Circle.h" //無參構造函數 Circle::Circle() { radius = 1; } //有參構造函數 Circle::Circle(double newRadius) { radius = newRadius; } //獲取面積 double Circle::getArea() { return radius*radius*PI; }
解釋一下符號“::”,這個符號在C++中叫做作用域解析運算符。顧名思義,它的作用就是用來解析作用域的。在上面的例子中,它告訴這些構造函數和函數,它們是屬於Circle類的。
更多關於“::”符號的解釋,可以參見下面這篇博客:
現在已經完成了類的定義和實現,也就是說,一個類已經完成了。接下來就是使用這個類了。
使用這個類和之前的做法大同小異,唯一不同的就是要在main.cpp中加上#include "Circle.h"
看下面的例子
#include <iostream> #include "Circle.h" using namespace std; int main() { //調用無參構造函數 Circle c1; //調用有參構造函數,參數為1 Circle c2(1); //調用有參構造函數,參數為3 Circle c3(3); cout << "c1的半徑是" << c1.radius << ",面積是" << c1.getArea() << endl; cout << "c2的半徑是" << c2.radius << ",面積是" << c2.getArea() << endl; cout << "c3的半徑是" << c3.radius << ",面積是" << c3.getArea() << endl; return 0; }
運行結果: