在头文件中声明变量和函数的重要性

时间:2014-03-16 09:41:44

标签: c++

我在.h文件中声明了所有变量和函数,并且已成为我的习惯(我用cocos2dx编程)

我读到你应该尝试在.hpp文件和.cpp文件中包含最少的文件。

因为我在.h文件中声明了所有变量和函数,如果我需要使用另一个文件中的另一个类,那么我需要在.h文件中包含该类以将该类声明为变量。

所以我想知道在.h文件和.cpp文件中声明变量的重要性。我想知道哪种方式最标准。

如果没有区别,那么为什么人们会在私有文件中声明变量和函数,因为在.h文件中声明一个函数需要你再次在.cpp文件中写入它。

IE)

.h file

class classA {
private:
    void function();
};

.cpp file

void classA::function() {
    ...do something...
}

在头文件中声明变量和函数的重要性是什么?

5 个答案:

答案 0 :(得分:3)

在头文件中的.cpp文件中声明代码之外所需的任何内容,而不再声明。尽量减少在那里的数量。原因是其他程序员可能正在查看您的标头(.h)文件,它本质上是他们的API。作为OOP程序员,您希望尽可能多地隐藏对象的内部工作,即您不希望使用API​​的人变得依赖于可能随对象结构而变化的因素。还要尽量保持变量范围尽可能低。如果可以的话,最好避免使用全局变量。将它们作为参数传递几乎总是一个更好的主意。尽量将变量保持在最低范围内。

答案 1 :(得分:2)

通常,您将在头文件中包含声明,并在cpp中包含定义。这样做有很多好处,其中最大的好处是可重用性。如果你有多个文件需要使用某个类,那么只需将它包含在需要的地方就好了,而不必重新声明它。

能够将原型与实际成员体分开也非常有用。这允许您执行诸如具有实现的二进制版本之类的操作,并且仍然保持函数名称公开可用。这样,如果有人使用您的类或库,他们可以看到如何使用它,但无法看到它是如何工作的。这在大型项目中以及涉及版权时非常重要。

这是一个很好的习惯,如果你不保持井井有条,可能会让人感到困惑和压倒性。通常的做法是为每个类提供一个实现文件(.cpp)和一个标题(.h),两者通常都与类具有相同的名称,以提高可读性。

您应该避免使用头文件来声明局部变量,因为通常最好将它们保存在需要它们的范围内。

答案 2 :(得分:1)

拥有单独的.h和.cpp文件的好处

  1. 隐藏实施:您可以将声明与定义分开。所以说你想要创建一个API,你可以把你的实际逻辑放在.cpp(它在编译时成为库文件)并在.h中声明一个可以用来访问API的声明。

  2. 缩短编译时间:.hpp中的定义和.h中的声明的一个好处是,您希望对定义进行更改。这样的更改,只会更改cpp文件,并且必须重新编译.cpp。如果定义是在.h文件中,则包含.h文件的所有.cpp文件都必须重新编译,这将花费更多时间。

  3. 提高可读性:在某些方面将声明和定义分开可提高可读性。

  4. 我们在C ++中使用单独的头文件和源文件的原因之一是因为C ++代码是不受管理的。它由处理器直接执行(与在虚拟环境中执行的C#,Java不同)。这需要一个头文件来保存符号信息,该信息虽然与实现分开,但却充当它的接口。

答案 3 :(得分:1)

对于您的特定示例,您可以使用Pimpl Idiom避免将类私有方法放入头文件中。您的头文件中只会声明公开显示(public / protected)成员,其余成员都会转到.cpp

.h file

class ClassA {
public:
    ClassA();
    ~ClassA();
    void foo();
private:
    class ClassAImpl;
    ClassAImpl* pImpl;
};

.cpp file

#include "ClassA.h"

struct ClassAImpl
    void function() {
        // ...do something...
    }
};

ClassA::ClassA() 
: pImpl(new ClassAImpl()) {
}

ClassA::~ClassA() {
    delete pImpl;
}

void ClassA::foo() {
     pImpl->function();
}

答案 4 :(得分:0)

在C和C ++中,声明事物的顺序很重要。请记住,当设计这些语言时 - 编译器不是它们今天的样子。头文件是你"包括"其中描述类,类型定义,枚举。现在,您可以在头文件中提供实现(对于C ++模板类,您拥有)。您将这些内容的实现放入.cpp文件中。你没有写两次函数(如果你这样做,编译器会有一个混合函数)。您声明在头文件中实现它们,然后,在前者的情况下,您在C ++文件中实现它们。

代码的消费者(例如,在库项目中)将包含头文件(描述类),然后链接对象文件(而不是{{1文件)。头文件提前为您提供了期望和链接的符号。

模板在这方面有点奇怪(你不能导出它们),它们只是头文件(目前,我相信)。

由于编译器的工作方式,C#等现代语言没有头文件的概念。 C#编译器将文件视为"整体"因此无需转发声明任何内容或担心头文件。 C / C ++编译器不这样做。我不确定(没有去查找)是否这是由于当时的编译器技术还是当时的一个狡猾的设计决定。

您没有复制代码。