在哪里/如何将函数放在头文件中与 C++ 源文件中

laq*_*3rd 3 c++ class header-files

有人在这里问了一个类似于我的问题: Function Declaration inside or outside of the class?

为什么只在.h文件中声明函数而不是定义,然后将整个定义写入.cpp文件中?重点是什么?为什么不把整个函数放在头文件中的一个类中,而不是仅仅声明它?这似乎是重复和毫无意义的。

如何构建程序以使用头文件和其他.cpp文件而不将函数、类和变量堆积到主文件中?我能得到一个使用.h文件和几个.cpp文件的简单程序的例子吗?

sse*_*ell 8

为什么你只是在.h文件中声明一个函数而不是定义,然后在一个.cpp文件中写入整个定义?重点是什么?为什么不把整个函数放在头文件中的一个类中,而不是仅仅声明它?这似乎是重复和毫无意义的。

修改头文件时,#include必须重新编译所有引用该头文件内容的代码。

如果您的头文件包含在许多其他文件中,则对该头文件内容的一次更改可能需要对整个项目进行相当冗长的重建。如果您只处理小型项目,这似乎并不重要,但想象一下具有数千个类的生产应用程序。

另一个好处是在编写库时。当您提供您的库二进制文件供其他人使用时,您只需要提供标题。通过这种方式,您可以在源文件中拥有用户无权访问的专有源代码。

最后,通过将内容分成单独的头文件和源文件,可以更轻松地学习库。很多时候,在使用新 API 时,我只想浏览标题以了解类及其功能的要点。我不需要查看或解析实现。

这并不是说您必须拥有单独的头文件和源文件。有许多只包含头文件的库(例如GLM)可以为广泛的受众提供服务。当然,这些通常仅作为标头分发,因此不需要二进制(静态或动态)。

当然,如果您正在创建模板类,则实现通常在 header 中


如何构建程序以使用头文件和其他.cpp文件而不将函数、类和变量堆积到主文件中?我能得到一个使用一个.h和几个.cpp文件的简单程序的例子吗?

这可能超出了本网站的范围,但这里有一个简单的例子。

矩形.hpp

#ifndef H__RECTANGLE__H
#define H__RECTANGLE__H

class Rectangle
{
public:

    Rectangle(float width = 0.0f, float height = 0.0f);
    ~Rectangle();

    void setWidth(float width) noexcept;
    void setHeight(float height) noexcept;

    float getArea() const noexcept;

protected:

private:

    float m_fWidth;
    float m_fHeight;
};

#endif
Run Code Online (Sandbox Code Playgroud)

矩形.cpp

#include "Rectangle.hpp"

Rectangle::Rectangle(float const width, float const height)
    : m_fWidth{ width },
      m_fHeight{ height }
{

}

Rectangle::~Rectangle()
{

}

float Rectangle::getArea() const noexcept
{
    return m_fWidth * m_fHeight;
}

void Rectangle::setWidth(float const width) noexcept
{
    m_fWidth = width;
}

void Rectangle::setHeight(float const height) noexcept
{
    m_fHeight = height;
}
Run Code Online (Sandbox Code Playgroud)

主程序

#include "Rectangle.hpp"
#include <iostream>

int main()
{
    Rectangle rectA{ 5, 5 };
    Rectangle rectB{ 3, 2 };

    std::cout << "Area of Rectangle A is: " << rectA.getArea() << std::endl;
    std::cout << "Area of Rectangle B is: " << rectB.getArea() << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在如何编译和链接这些文件取决于您使用的 IDE。