我对C ++很新,我看到一堆代码在头文件中有方法定义,并且它们没有将头文件声明为类。有人可以向我解释为什么以及何时会做这样的事情。这是一种不好的做法吗?
提前致谢!
答案 0 :(得分:11)
这是一种不好的做法吗?
不一般。有很多库是header only
,这意味着它们只提供头文件。 可以被视为编译库的轻量级替代品。
更重要的是,有一种情况是无法使用单独的预编译编译单元:模板必须专门用于声明它们的同一编译单元。这可能听起来很神秘,但结果很简单:
无法在cpp文件中定义函数(和类)模板并在其他地方使用;相反,他们直接在头文件中定义(有一些值得注意的例外)。
此外,C ++中的类完全是可选的 - 虽然可以使用C ++编程面向对象,但许多优秀的代码却没有。类补充了C ++中的算法,而不是相反。
答案 1 :(得分:4)
这不是一种糟糕的做法。 C ++的优点在于它允许您以多种样式进行编程。这为语言提供了极大的灵活性和实用性,但可能比其他语言更难以学习,这些语言迫使您以特定的方式编写代码。
如果你有一个小程序,你可以在一个函数中编写它 - 可能使用几个goto代码流。
当你变得更大时,将代码分解为函数有助于组织事物。
更大,类通常是分组处理某组数据的相关函数的好方法。
更大的是,命名空间有用了。
有时候,编写一个函数来做某事是最简单的。这通常是您编写仅适用于基本类型(如int)的函数的情况。 int没有类,所以如果你想编写一个printInt()函数,你可以将它作为独立函数。此外,如果一个函数适用于来自多个类的对象,但并不真正属于一个类而不属于另一个类,那么这可能作为独立函数有意义。当您编写诸如define之类的运算符以便它可以比较两个不同类的对象时,会发生这种情况。或者,如果函数可以根据类公共方法编写,并且不需要直接访问类的数据,则有些人更喜欢将其作为独立函数编写。
但是,真的,选择是你的。无论做什么最简单的事情都可以解决你的问题。
你可能只是将一个程序作为一些函数启动,然后决定一些是相关的并将它们重构为一个类。但是,如果其他独立函数自然不适合某个类,则不必将它们强制合并为一个。
答案 2 :(得分:1)
H文件只是包含一堆声明的一种方式。 C ++中的许多东西都是有用的声明,包括类,类型,常量,全局函数等。
C ++具有强大的面向对象方面。大多数OO语言解决了在何处处理不依赖于对象状态而实际上不需要该对象的操作的问题。
在某些语言中,如Java,语言限制迫使所有内容都在一个类中,因此所有内容都成为静态成员函数(例如,带有数学实用程序或算法的类)。
在C ++中,为了保持与C的兼容性,您可以声明独立的C风格函数或使用Java风格的静态成员。我个人认为,在可能的情况下,使用OO风格并围绕中心概念组织操作会更好。
但是,C ++确实提供了名称空间设施,并且通常以与在这些情况下使用类相同的方式使用它 - 将一组独立项组合在一起,其中每个项都以“名称空间”名称作为前缀。正如其他人所指出的那样,许多C ++标准库函数都是以这种方式定位的。我的观点是,这很像在Java中使用类。但是,其他人会争辩说Java使用类,因为它没有名称空间。 只要您使用其中一个(而不是浮动的独立非命名空间函数),您通常就可以了。
答案 3 :(得分:0)
我对C ++很新,我看到一堆代码在头文件中有方法定义,并且它们没有将头文件声明为类。
让我们澄清事情。
头文件中的方法定义
这意味着: 档案“A.h”:
class A {
void method(){/*blah blah*/} //definition of a method
};
这是你的意思吗?
稍后你会说“声明头文件”。在C ++中没有用于声明文件的机制。可以通过引用#include "filename.h"
来包含文件。如果这样做,在编译任何内容之前,头文件的内容将被复制并粘贴到上面一行的任何位置。
所以你的意思是所有的定义都在类定义中(不是在A.h文件中的任何地方,但特别是在A类中,它受到'A类{'和'};'的限制)。 在类定义中使用方法定义的含义是该方法将是“内联”(这是C ++关键字),这意味着只要调用它就会粘贴方法体。这是:
模板的内容与上述人员不同,但对于他们来说,有一种方法可以定义方法,使它们不是内联的,但仍然在头文件中(它们必须在标题中)。无论如何,这个定义必须在类定义之外。
答案 4 :(得分:-1)
在C ++中,函数不必是类的成员。