C++ 对C+中头文件的实际用途感到困惑+;

C++ 对C+中头文件的实际用途感到困惑+;,c++,C++,可能重复: 我不太喜欢C++的头文件,因为两个相互冲突的原因: 我认为头文件的目的通常是分离接口和实现。换句话说,客户机使用头文件来学习如何使用该类,但不必担心该类实际上如何在内部实现该功能 > P>为什么在它的头文件中指定C++类的私有变量? 在我看来,在头文件中包含私有变量违反了接口和实现的分离。直觉上,我认为私有变量在源文件中更有意义,因为这是一个不对外公开的文件 也许我只是误解了头文件的用途,1。以上是完全错误的吗?在哪些方面?C++区分函数和类的声明和定义。一般来说,C++头文件包

可能重复:

我不太喜欢C++的头文件,因为两个相互冲突的原因:

  • 我认为头文件的目的通常是分离接口和实现。换句话说,客户机使用头文件来学习如何使用该类,但不必担心该类实际上如何在内部实现该功能

  • > P>为什么在它的头文件中指定C++类的私有变量?

    在我看来,在头文件中包含私有变量违反了接口和实现的分离。直觉上,我认为私有变量在源文件中更有意义,因为这是一个不对外公开的文件


    也许我只是误解了头文件的用途,1。以上是完全错误的吗?在哪些方面?

    C++区分函数和类的声明和定义。一般来说,C++头文件包含类的声明。由于不允许部分声明,头文件需要包含完整的类声明,包括所有私有成员(变量和成员函数)


    如果你想将完整的实现隐藏于公共,你可以使用它来实现。

    < P> C++头文件的主要功能目的是在C++语言中没有模块导入或其他语言中存在的任何类似的东西。编译器从其他文件了解类型、函数等的唯一方法是使用
    #include
    将代码粘贴到当前源文件中

    从理论上讲,您也可以将所有源代码放入头文件中,只需要一个包含所有头文件的源文件。通常不这样做的原因有两个。首先,编译需要更长的时间(这是一些项目的一个重要问题),对任何文件的任何更改都会导致项目的完全重新编译。其次,将实现放入源文件实际上有助于将接口与实现分离,即使实现的一部分仍然在头文件中指定

    请注意,头文件中的内联方法在实现细节方面也走得很好,公开给类的公共/客户机


    <>如果您真的希望完全将接口与实现(具有一定的优点)分开,C++的方式就是使用piml习惯用法。使用这个习惯用法,所有私有数据都隐藏在源文件中,只有一个抽象接口提供给公众。此外,使用非虚拟接口(NVI)模式可以进一步帮助将客户端与接口更改隔离。

    在C/C++中,头文件的一个用途是允许多个翻译单元使用具有相同定义的类型,而无需跨多个文件复制定义。类定义的一部分是其私有成员。

    头文件的目的是为编译器提供在编译单元(.cpp源文件)之间共享定义所需的信息。这是机械的东西,不是哲学的东西


    例如,需要声明私有成员变量,因为它们定义了对象的大小,编译器在分配对象时需要知道对象的大小。

    除了
    友元
    函数,我敢说,编译器只是确定技术的限制,决定了该类的大小。@ DaveSwersky,DUPE不回答OP的第二个问题,“为什么,那么,它的头文件中指定的C++类的私有变量?”@ MyStudi:第二个答案回答了这两个点。@ NoobOverflow,在第1点你是正确的。第二点也是个好问题。答案是,在大多数情况下,C++编译模型很糟糕。2,使用类的代码知道类有多大,所以它知道在堆栈上创建的实例有多少空间可以离开,这样就不能成为编译单元之间“共享声明”的正确术语。它经常被混淆,声明和定义的意思是…@ G-Mkulik,我用的是“英语”的“定义”,而不是正式的C++用法。当然可以在标题中包含定义,例如模板,这几乎是强制性的。为什么只有私有成员变量?@zgulser不仅仅是私有成员变量,这只是一个例子。这确实是需要的全部声明。@markransem谢谢Mark。实际上,我很惊讶没有人提到分配(但你),因为我相信这是为什么C++必须将对象状态放在头文件中以知道它的大小以用于堆栈上分配的主要原因。我想这是他们唯一能想到的办法。虽然Java把事情搞得一团糟,但把所有的东西都放在一个罐子里。