我有一点C ++背景,但我刚刚进入该语言的面向对象编程方面。我正在阅读关于类格式的C ++ Tutorials网站。我读到可以在类中声明一个函数,然后使用scope运算符::在类外部定义它。鉴于我的经验不足,我想知道是否广泛使用该函数是否在类中定义,或者是否优先在类外定义,或者它是否真的无关紧要。
来自C ++ Tutorials网站
// classes example
#include <iostream>
using namespace std;
class Rectangle {
int width, height;
public:
void set_values (int,int);
int area() {return width*height;}
};
void Rectangle::set_values (int x, int y) {
width = x;
height = y;
}
意思是,在类中包含set_values定义会不会更加紧凑和高效?
一如既往,谢谢。
答案 0 :(得分:1)
通常在.h
个文件中找到声明,而定义在.cpp
个同名文件中。
示例:
rectangle.h:
class Rectangle {
int width, height;
public:
void set_values (int,int);
int area() {return width*height;}
};
rectangle.cpp:
#include <rectangle.h>
void Rectangle::set_values (int x, int y) {
width = x;
height = y;
}
这有助于将代码分发给其他人。您可以为其他人分发.dll
和.h
,以便将实际代码保存在.cpp
个文件中。
当.h
文件开始增长时,它也很有用。查看一千行的.cpp
个文件并不罕见。通过所有这些只是为了找到该类的公共接口需要付出很多努力。
注意:.h
和.cpp
只是惯例。您可以找到其他人,例如.cxx
和.inl
(内联函数)。
答案 1 :(得分:0)
声明中的简短方法很好。较长的一般通常与cpp文件中的其他方法保持一致。 Getter和setter通常很短,所以有些人(不是原作者)在学习或调试其他更重要的方法时不需要太在意它们。
答案 2 :(得分:0)
这取决于您遵循的惯例。
Commonplace惯例是将getter和setter放在头文件中,因为这些函数很可能被频繁调用,因此应该由编译器内联。将函数放在头文件中会鼓励(但不保证)编译器执行此操作。
接下来,由于各种原因,应该在.cpp中保留更长的声明。首先,如果您在.h中进行任何更改,则必须重新编译包括该标头的任何文件。根据您的项目,这可能会显着增加时间。其次,这提供了一种“隐藏”方法和要构建到库中的专有代码。在这种情况下,在最常见的良好编程习惯的情况下,您希望头文件成为程序员的指南,他们可以快速查看类的功能,并根据注释判断如何处理使用该课程提供的功能。
答案 3 :(得分:0)
在这种情况下,这是个人选择。我会将该函数放在类中,而不用担心范围解析。
范围解析用于访问具有相同名称的本地和全局变量。
答案 4 :(得分:0)
在C ++中,您主要将类定义放在头文件(.h)中,并将成员函数的实现放在代码文件(.cpp)中。因此,在类定义之外实现一个函数是很常见的。唯一突出的例外是模板类的定义,其中完整的实现位于.h(或甚至。)文件中。
这与其他编程语言(如C#或Java)形成鲜明对比,不需要将其拆分为.h / .cpp文件,因为编译器输出包含所包含类的元数据,因此生成.h文件过时。
答案 5 :(得分:0)
是的,如果类定义和实现在同一个文件中,它会更紧凑。
但通常您会将定义分离为头文件,将实现分离为源文件。这使您可以替换幕后实现,而无需更改定义并强制重新编译类的客户端。
此外,如果将实现和定义捆绑在一起,包括标头将导致实现重复,从而导致更大的输出对象文件,并且通常会发生链接器对重复名称的争议。
对于较小的方法,例如单个操作吸气剂,尺寸影响很小。编译器通常会抛弃该方法,而不是直接访问。
答案 6 :(得分:0)
绝对是偏好。我肯定一直在.cpp文件中保留实际的功能,因为我想保持头文件尽可能干净。为了牢记OOP的重点,任何人都可以很好地了解这个类通常可以做什么,保持详细信息从头文件中看起来比使用声明保持函数并使整个文件保持很长时间更好并且很难得到很好的概述。但同样,这真的是偏爱。
答案 7 :(得分:0)
与Java和C#不同,通常的C ++实践是将类定义放在.h
文件中,并将类成员函数的实现放在.cpp
文件中。这样做的原因有几个。
.cpp
文件中分离代码的实现,您可以轻松地分发图书馆。当您希望将代码用作其他几个项目中的库时,可以将已编译的二进制文件(.a,.dll,.so或.dylib)与项目的头文件一起分发。这使得任何试图使用您的库及其在几乎所有第三方库中完成的人都更容易。有一些例外,其中短函数(通常不包含任何循环等)在头文件本身内声明,并且还作为inline
函数加前缀。这告诉编译器优化给定的成员函数并用内联指令替换它们。 (更多关于内联函数的好处here