1. 程式人生 > >C++學習筆記 — 理解標頭檔案(.h)和原始檔(.cpp)

C++學習筆記 — 理解標頭檔案(.h)和原始檔(.cpp)

原始檔根據#include來關聯檔案

  1. 系統自帶的檔案用尖括號括起來,編譯器會在系統檔案目錄下查詢 #include <>
  2. 使用者自定義的檔案用雙括號括起來,編譯器首先在使用者目錄下查詢,然後在C++安裝目錄中查詢,最後在系統檔案中查詢 #include ""

標頭檔案(.h)

  1. 類的宣告(包括類裡面的成員和方法的宣告)、函式原型#define常數等,但一般來說不寫出類的具體實現。
  2. 在寫標頭檔案時需要注意,開頭和結尾必須按照如下樣式加上預編譯語句
#ifndef CIRCLE_H
#define CIRCLE_H
// your code
#endif

這樣做的目的是防止重複編譯。至於CIRCLE_H這個名字實際上是無所謂的,你叫什麼都行,只要符合規範都行。原則上來說,非常建議把它寫成這種形式,因為比較容易和標頭檔案的名字對應。

原始檔(.cpp)

原始檔主要寫實現標頭檔案中以及宣告的那些函式的具體程式碼,需要注意的是,開頭必須#include下實現的標頭檔案,以及要用的的檔案

例項

我們使用clion進行開發。 Circle.h檔案

#ifndef TUTORIALS2_CIRCLE_H
#define TUTORIALS2_CIRCLE_H


class Circle{
private:
    double r;
public:
    Circle();
    Circle(double R);
    double Area();
};


#endif //TUTORIALS2_CIRCLE_H

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;
}

main.cpp檔案

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

int main() {
    std::cout << "Hello, World!" <<
std::endl; Circle c(3); cout << c.Area() << endl; return 0; }

Tips:

  1. Circle.h叫做標頭檔案,它是不能被編譯的。#include叫做編譯預處理指令,可以簡單理解成,在Circle.cpp中的#include"Circle.h"指令把Circle.h中的程式碼在編譯前新增到了Circle.cpp的頭部。每個.cpp檔案會被編譯,生成一個.obj檔案,然後所有的.obj檔案連結起來你的可執行程式就算生成了。

  2. 至於.h和.cpp具有同樣的主檔名的情況呢,對編譯器來講是沒有什麼意義的,編譯器不會去匹配二者的主檔名,相反它很傻,只認#include等語句。但是這樣寫是一種約定俗成的程式設計風格**,一個類的名字作為其標頭檔案和原始檔的主檔名比如Class1.h和Class1.cpp,這個類的宣告在Class1.h中,實現在Class1.cpp中,我們人類看起來比較整齊,讀起來方便,也很有利於模組化和原始碼的重用**