在 C++ 中创建头文件
本文将解释几种如何在 C++ 中创建头文件的方法。
使用 .h
或 .hpp
后缀在 C++ 中创建头文件
当代程序很少是在没有库的情况下编写的,而库是由其他人实现的代码构造。C++ 提供了特殊的标记-#include
来导入所需的库头文件和外部函数或数据结构。请注意,通常,库头文件具有特定的文件名后缀,例如 library_name.h
或 library_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);
}
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