我来自.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
中的声明。是否有任何优势,规则和最佳实践?
答案 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类实现),甚至选择一致性或其他原因不要直接在类体中拥有所有内容,这非常有用。