所有的C++头文件都是一个类吗?

8
我正在阅读Deitel的C++书籍,到了这一部分:
一些函数,例如main,不是类的成员。这些函数被称为全局函数。我们在此介绍各种头文件中的函数来介绍不属于特定类的全局函数的概念。
在说完这个块(这个块本身正好在Math库下面)之后,它介绍了一些函数,例如sqrt(),它属于cmath头文件,最后它说所有属于cmath的函数都是全局的!
所以,我的问题是:在顶部,我们说所有不属于任何类的函数都是全局函数;但是然后它说所有与cmath相关的函数都是全局的!那这不是矛盾吗? 我的意思是,如果我们接受这个,那么意味着并非所有的头文件都是类。这是正确的吗?

C++ Deitel Book


@uneven_mark 那么头文件是什么?我们可以使用头文件来包含我们的类。我的意思是,它们的一个用途是包含类,那么其他用途是什么呢? - Farbod Ahmadian
5
你是否错过了描述预处理器如何工作以及头文件是什么的章节?它们只是包含程序文本块的文件,当它们被包含到其他文件中时,预处理器会将它们粘接起来。 - user7860670
在https://stackoverflow.com/a/9579974/5595995中,有一种声明和定义类的实践方法。 - undefined
4个回答

8

头文件本身不会引入新的作用域、命名空间,甚至没有任何类。

使用预处理器 #include 指令包含的头文件基本上是按原样复制粘贴到编译器的后续阶段要解析的翻译单元中。

简而言之,源文件和头文件实际上没有什么区别。两者都可以包含函数或类的声明或定义。


一个非常简化的例子。

假设您有包含单个函数声明的头文件a.h:

void a_function();

你有一个包含头文件的源文件:

#include "a.h"

int main()
{
    a_function();
}

经过预处理,翻译单元会变成这个样子:
void a_function();

int main()
{
    a_function();
}

a_function函数不属于任何类,它是一个全局函数。


那个示例代码完全解决了问题。顺便说一句,谢谢你 ;) - Farbod Ahmadian

4

一个头文件(header)是一个文件,而类是由classstruct引入的类型。虽然人们常常将每个类放在专门的头文件中进行组织,但它们之间没有具体的关系。例如,<cmath>只是一些全局(或者更准确地说是命名空间范围内的)和数学相关的函数的集合,并不需要“math”类。

我们可以使用头文件来包含我们的类。我的意思是,其中一个用途是用于包含类,那么其他用途是什么呢?

我们使用头文件来包含各种声明(挑剔一下:定义也可以),不仅仅是类声明。这些可以是类、typedef、函数、变量、命名常量等等。


3
除了你已经得到的所有其他答案外,我想给你展示一些例子,这些例子应该能够让你明白#include ...只是一个复制粘贴机制。
我有三个文件:
CodeBody.h
std::cout << a << std::endl;

Numbers.h

1, 2, 3, 4, 5, 6, 7, 8

以及main.cpp

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> bla = {
#include "Numbers.h"
    };

    for (auto a : bla) {
#include "CodeBody.h"
    }

    return 0;
}

这将编译并输出以下内容:
1
2
3
4
5
6
7
8

现在,我会说像我在CodeBody.h中粘贴代码这样的做法有些可疑,你不应该这样做。但是使用一个包含文件来填充数组或其他数据结构是相当常见的,例如在数字信号处理中,您使用一个专用程序来计算滤波器的系数,将它们保存到文件中,然后通过包含文件将它们导入到您的程序中。


2

“不是所有的头文件都是类”,这是重点。

头文件只是文件(即代码容器)。这有助于模块化或代码管理:将代码的不同部分放在不同的文件中。

类是一种语言结构。这样的结构可以放在任何你想要的文件中(最糟糕的情况下可以分散在不同的文件中)。

更明确地说,头文件只是纸张,而类是你可以在上面写东西的东西。


吹毛求疵:并非所有的标题都是类,而“并非所有标题都是类”听起来好像有一些标题是类。 - 463035818_is_not_a_number

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接