为什么/何时应该使用c ++中的scope运算符声明我的类之外的方法?

时间:2013-09-15 09:09:19

标签: c++

我来自.Net背景,我开始学习c ++,我在教程here中看到,可以通过范围运算符{{1}定义类外部函数的内容。 }。

以下是教程中给出的示例:

::

我在谷歌上找到的所有内容都是关于范围解析的,但我想知道为什么/何时应该使用像// classes example #include <iostream> using namespace std; class CRectangle { int x, y; public: void set_values (int,int); int area () {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a; y = b; } int main () { CRectangle rect; rect.set_values (3,4); cout << "area: " << rect.area(); return 0; } 这样的声明而不是类set_values中的声明。是否有任何优势,规则和最佳实践?

4 个答案:

答案 0 :(得分:2)

只有当你想将函数实现放在一个单独的文件中时才会这样做 - 主要是.cpp

头文件几乎总是有.h扩展名。头文件的目的是保存要使用的其他文件的声明。你最常定义的是这个类看起来是什么样的 - 函数的定义。如果你需要做很多课程,这很有用。 使用.cpp进入细节 - 实际实现头文件中“已定义”的函数。

如果涉及很多类,使用header和cpp文件将减少构建时间。如果你感觉非常勇敢并希望进一步减少构建时间,那么我建议阅读有关PIMPL模式的内容。

您可以阅读有关基本信息here

的更多信息

答案 1 :(得分:1)

分割声明和实现的主要优点在于您制作代码时,将分发给最终用户,例如:库。

当你分发代码时,你只分发头文件和目标文件* .o。这样你的超级奇特的密码是安全的,在.o文件中编译,最终用户仍然可以使用它,因为他有.h文件,co links知道在哪里看。

答案 2 :(得分:1)

这确实是一个很好的问题,这一切都归结为编译时间。来自.NET背景的人在理解#include和例如using之间的差异时遇到了一些困难。 C#的#include声明。要记住的是:

#include指令会复制粘贴所包含文件的内容。

因此,如果您将实现代码放在标头中,那么基本上是在每个{{1}}站点编译一次(并且链接器必须删除重复的代码)。此外,如果更改cpp文件,它将单独重新编译。如果更改头文件,包含它的所有文件(也间接!)将被重新编译。

所以尽可能多地放入实现(即.cpp)文件。编译器已经变得足够好作为链接时间代码优化,这可以防止内联的事实不像以前那样成为问题。

虽然使用模板是不可能的,并且这可以解释使用C ++时可以看到的很长的编译时间。

答案 3 :(得分:0)

关键是要分离类方法定义,声明和实现。如果你想把它们放在不同的文件中(通常,header包含类定义和.cpp类实现),甚至选择一致性或其他原因不要直接在类体中拥有所有内容,这非常有用。