繁体   English   中英

声明类成员函数

[英]Declaring Class Member Functions

我有一点C ++背景,但是只是进入该语言的面向对象编程方面。 我正在阅读有关类格式的C ++教程网站。 我读到有可能在类中声明一个函数,然后使用范围运算符::在类外定义一个函数。 鉴于我的经验不足,我想知道是在类内定义函数是广泛的首选,还是在类外定义函数是首选还是真的没有关系。

从C ++教程网站

// 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定义包含在类中会更紧凑,更有效吗?

一如既往,谢谢。

通常,声明位于.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 (用于内联函数)。

声明内可以使用短方法。 通常,较长的方法最好与cpp文件中的其他方法一起使用。 Getter和Setter通常很短,因此在学习或调试其他更重要的方法时,某人(不是原始作者)不需要过多地关心它们。

这取决于您遵循的约定。

常见的约定是将getter和setter放在头文件中,因为这些函数很可能经常被调用,因此应由编译器内联。 将函数放在头文件中会鼓励(但不能保证)编译器执行此操作。

继续,出于各种原因,应在.cpp中保留更长的声明。 首先,如果您对.h进行了任何更改,它必须重新编译包括该标头的所有文件。 根据您的项目,这可能会花费大量时间。 其次,这提供了一种“隐藏”和专有代码的方法,这些代码要构建到库中。 在这种情况下,并且是在良好编程习惯的最常见情况下,您希望头文件为程序员提供指导,使他们可以快速查看类的功能,并根据注释判断如何使用该类。该类提供的功能。

在这种情况下,这实际上是个人选择。 我会将函数放在类中,而不用担心范围解析。

范围解析用于访问具有相同名称的局部变量和全局变量。

在C ++中,您通常将类定义放在头文件(.h)中,并将成员函数的实现放在代码文件(.cpp)中。 因此,在类定义之外实现函数是很常见的。 唯一显着的例外是模板类的定义,其中完整的实现位于.h(甚至。)文件中。

这与其他编程语言(例如C#或Java)相反,它们不需要将此内容拆分为.h / .cpp文件,因为编译器输出包含所包含类的元数据,因此使.h文件作废。

是的,如果类定义和实现位于同一个文件中,则它将更加紧凑。

但是通常您会将定义分为头文件,将实现分为源文件。 这使您可以替换幕后实现,而不必更改定义并强制重新编译类的客户端。

此外,如果将实现和定义捆绑在一起,则包括标头将导致实现被重复,从而导致输出目标文件大得多,并且链接程序经常会因重复的名称而产生争议。

对于较小的方法,例如单个操作吸气剂,尺寸影响最小。 通常,编译器会放弃该方法,而直接访问。

这绝对取决于偏好。 我绝对将实际功能始终保存在.cpp文件中,因为我想保持头文件尽可能的干净。 为了牢记OOP的要点,任何人都可以很好地了解此类的一般功能,将细节保留在头文件中似乎比保留带有声明的函数并使整个文件很长的方法更好。并且很难获得很好的概述。 但同样,这实际上取决于偏好。

与Java和C#不同,通常的C ++做法是将类定义放在.h文件中,并将类成员函数的实现放入.cpp文件中。 这样做有几个原因。

  • 这增加了类的可读性。
  • 如果您是库开发人员,则通过在.cpp文件中分离代码的实现,可以使库易于分发。 如果希望将代码用作其他几个项目中的库,则可以将已编译的二进制文件(.a,.dll,.so或.dylib)与项目的头文件一起分发。 这对于任何尝试使用您的库的人来说都很容易,并且几乎在所有第三方库中都可以使用它。

在头文件本身中声明短函数(通常不包含任何循环等)的情况也有一些例外,它们也以内inline函数为前缀。 这告诉编译器优化给定的成员函数,并用内联指令替换它们。 (更多关于内联函数的好处在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM