C ++标题中的内容以及CPP文件中的内容是什么?

时间:2011-07-22 03:02:33

标签: c++

  

可能重复:
  C++ - What should go into an .h file?

我是一个使用C ++的完整菜鸟并且慢慢学习。我来自C#背景。我理解什么可以进入头文件而不是可以进入实际的cpp实现文件。但到底是什么的最佳做法是什么?例如,您可以在标头和转发声明函数中声明该类,但您也可以将实现细节作为内联函数。

4 个答案:

答案 0 :(得分:3)

标头通常保留给您的类/结构定义,宏和内联函数。在CPP文件中,您的类的方法和成员方法的实现时间往往较长。通常,您只想在标题中转发您希望允许其他人使用的声明函数(如果由于类而没有访问修饰符)。

答案 1 :(得分:2)

通常,声明属于标题,定义属于cpp。有一些例外,我遇到的两个例外是内联函数和模板。这两者都需要在头文件中使用函数原型进行定义。

答案 2 :(得分:1)

这里有两个基本考虑因素:编译器的需求和良好源代码组织的目标。一般来说,我发现头文件应尽可能包含 little 代码,同时仍然保持编译器满意。头文件也应该#include为少数其他头文件,尽可能选择正向类型声明到#include语句。这减少了源文件之间的依赖关系数量并减少了编译时间。它还有助于避免源文件之间的循环依赖关系。

虽然几乎所有函数实现都在.cpp文件中,但编译依赖类型时编译器函数和内联函数需要可供编译器使用。我没有将它们放在头文件中,而是将它们放在第三个文件中(我将扩展名.icpp用于'included'实现)。此文件在头文件的底部中#included(#ifdef guard内部),使.hpp文件不受所有实现细节的影响。虽然编译器不需要,但头文件确实包含所有模板和内联函数的文档声明。就个人而言,我从不编写“隐式”内联函数,其中函数定义包含在类定义中。

因此,对于多个.cpp文件使用的所有类,类型和函数,类定义,类型定义和函数声明都放在头文件中,相应的函数定义(实现)放在.cpp中文件,除了内联和模板函数的定义,请进入.icpp文件。我成功地避免了全局数据,因此我没有任何规则。我通常最终使用静态成员数据,通过全局或静态成员函数访问,并且上述指南适用。

仅在一个.cpp文件中使用的类,类型和函数我有时会放在.cpp文件中。这些将始终是简单的实用函数,在其他地方重用的可能性非常低。它们位于一个匿名命名空间中,可以防止它们与其他.cpp文件中的其他类型和函数发生名称冲突。

对于私有数据,从概念上讲,某个类的用户无法知道某个类的私有数据(或函数)。但是,C ++语法要求将这些声明为类定义的一部分,因此它们确实出现在头文件中。这通常不是问题,但如果是Pimpl设计模式可以用作解决方法。在这里定义两个类,Foo和FooImpl,其中FooImpl保存所有数据,Foo保存FooImpl的实例。 FooImpl.hpp在Foo.hpp中 #included,从而隐藏了Foo用户的实现细节。)

答案 3 :(得分:0)

头文件通常包含类,子例程,变量和其他标识符的前向声明。