C++類和對象之類定義和類實現的分離


類定義和類實現的分離

類定義就是指定義類名,類的數據域和類里面的函數。只是定義而不去實現。這一概念有點像是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類的。

更多關於“::”符號的解釋,可以參見下面這篇博客:

C++ 二元作用域運算符(::)

現在已經完成了類的定義和實現,也就是說,一個類已經完成了。接下來就是使用這個類了。

使用這個類和之前的做法大同小異,唯一不同的就是要在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;
}

運行結果:

 


免責聲明!

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



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