繁体   English   中英

C ++类构造函数

[英]C++ class constructor

我有一个类的骨架,如下所示:

class MyList
{
    private:
    public:MyList(int);    // why can't I define stuffs here?
};

MyList::MyList(int s)     // why is this outside of the class?
{
}

我想知道为什么构造函数放在类本身之外? 将其放置在类本身中会不会更紧凑,更美观?

如果需要,您绝对可以使构造函数内联(“ Java样式”),对于不太可能经常更改的简单的单行方法,这通常是可行的方法。

您可能会问的问题是,允许非内联版本进行内联时有什么意义?

您可能有几个原因想要做一个非内联构造函数(或者实际上是任何方法的非内联样式):

  1. 由于.h文件被其他文件#included包含,因此,每次更改.h文件时,可能需要任何包含#h的.cpp文件(以及包含.h文件的.cpp文件和包含.h文件的任何.cpp文件)重新编译。 如果您的程序很大和/或您需要大量更改内联方法,这可能会使开发变慢。

  2. 将方法的主体与其定义分开,可以为您解决循环包含问题的方法 -例如,它将允许您拥有两个类,其方法参数分别引用另一个类(通过指针或引用)。 仅使用内联代码,就必须在解析另一个类的.h文件之前解析这两个类之一的方法主体,这很可能会导致“不完整类型”或“未知类型”的编译错误。

我想知道为什么构造函数放在类本身之外?

函数定义可以放在外面,也可以放在里面。 这适用于所有成员函数,而不仅仅是构造函数。 因此,让我让您的问题更笼统:在类外部定义成员函数有什么好处?

它可以使类的定义简短明了。 这对于保持类定义的可读性很有用:成员声明对于读取其定义的类的用户而言是最有用的信息。 成员函数的定义通常是一个不能或不应该依赖的实现细节。

它还允许在单独的源文件中定义成员函数,而不是在内联的所有源文件中内联定义。

因此,优点与将自由函数的前向声明与它们的定义分开一样。 标头中的函数声明列表类似于简洁的类定义,没有内联函数定义。

在其自己的源文件中而不是在所有源文件的内联中离线定义函数(成员或其他)是很有用的,因为它允许单独编译单个源文件。 如果对该函数进行了任何更改,则无需编译其他源文件。 在嵌入式情况下,所有使用该功能的源文件都必须再次编译。 同样,无论何时编译任何其他源文件,都无需从另一个源文件编译脱机函数,但是必须在每个源文件中编译一个内联函数。


这些一般优点几乎不适用于您的琐碎示例构造函数。 它是内联定义的理想选择,因为可以完全优化其调用。 而且,它太短了以至于不影响类的可读性。 因此,我建议不要在类本身之外定义该构造函数。

您可以将构造函数定义放在类定义中。 两种方式都像其他功能一样工作。 放置位置取决于诸如定义长度之类的东西。

您可以将构造函数放在任一位置。 编译器没有区别。 但是,在团队中遵循的惯例更多。 一些组遵循在* .cpp文件中定义所有内容的约定,从标准方法(例如构造函数,析构函数,复制构造函数,运算符重载,用户定义的方法)开始。

它使代码易于阅读,并随着代码库的扩展而得以维护。

暂无
暂无

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

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