在 C++ 中创建头文件

Jinku Hu 2023年1月30日 2021年4月29日
  1. 使用 .h.hpp 后缀在 C++ 中创建头文件
  2. 使用头文件将程序中的独立功能块分解成模块
在 C++ 中创建头文件

本文将解释几种如何在 C++ 中创建头文件的方法。

使用 .h.hpp 后缀在 C++ 中创建头文件

当代程序很少是在没有库的情况下编写的,而库是由其他人实现的代码构造。C++ 提供了特殊的标记-#include 来导入所需的库头文件和外部函数或数据结构。请注意,通常,库头文件具有特定的文件名后缀,例如 library_name.hlibrary_name.hpp。C++ 程序结构提供了头文件的概念,以简化某些可重用代码块的使用。因此,用户可以创建自己的头文件,并根据需要将其包括在源文件中。

假设用户需要实现一个名为 Point 的类,其中包含两个类型为 double 的数据成员。该类具有两个构造函数和其中定义的+ 运算符。它还具有打印函数,可将两个数据成员的值输出到 cout 流。通常,还有一些头保护符将 Point 类定义括起来,以确保在包含在相对较大的程序中时不会发生名称冲突。请注意,在包含保护之后定义的变量名称应具有一致的命名方案;通常,这些变量以类本身的名字命名。

#ifndef POINT_H
#define POINT_H

class Point {
    double x,y;
public:
    Point();
    Point(double,double);
    Point operator+(const Point &other) const;
    void print();
};

#endif

Point 类构造头文件的另一种方法是在同一文件中包含函数实现代码。请注意,将先前的代码片段放入 Point.hpp 文件中,并包含它将会引发一些未定义的错误。由于这些函数是在以下示例代码中定义的,因此我们可以将其作为 Point.hpp 头文件包含在内,并使用该类及其方法。

#include <iostream>
#include <vector>

#ifndef POINT_H
#define POINT_H

class Point {
    double x,y;
public:
    Point();
    Point(double,double);
    Point operator+(const Point &other) const;
    void print();
};

Point::Point() {
    x = y = 0.0;
}

Point::Point(double a, double b) {
    x = a;
    y = b;
}

Point Point::operator+(const Point &other) const {
    return {x + other.x, y + other.y};
}

void Point::print() {
    std::cout << "(" << x << "," << y << ")" << std::endl;
}

#endif

使用头文件将程序中的独立功能块分解成模块

或者,可以使用基于模块的分隔方案来处理给定类的头文件和相应的源文件,以实现更灵活的项目文件结构。在这种设计中,应该在单独的 .hpp 头文件中定义每个功能上不同的类,并在具有相同名称的源文件中实现其方法。一旦将类所需的头文件包含在主源文件中并进行编译,预处理器将合并所有包含的头文件中的代码块,其结果将与编译以下源代码相同,后者可在单个代码中实现功能源文件。

#include <iostream>
#include <vector>

#ifndef POINT_H
#define POINT_H

class Point {
    double x,y;
public:
    Point();
    Point(double,double);
    Point operator+(const Point &other) const;
    void print();
};

Point::Point() {
    x = y = 0.0;
}

Point::Point(double a, double b) {
    x = a;
    y = b;
}

Point Point::operator+(const Point &other) const {
    return {x + other.x, y + other.y};
}

void Point::print() {
    std::cout << "(" << x << "," << y << ")" << std::endl;
}
#endif

using std::cout; using std::cin;

int main () {
    double x, y;
    
    cin >> x >> y;
    Point a1(x, y);
    cin >> x >> y;
    Point a2(x, y);
    
    cout << "a1: ";
    a1.print();
    cout << "a2: ";
    a2.print();
    
    a1 = a1 + a2;
    cout << "a1+a2: ";
    a1.print();
    
    exit(EXIT_SUCCESS);
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn