3

考虑这个链接。请参阅此代码:

 class MyClass
    {
    public:
        MyClass();
        ~MyClass();
    
    private:
        int _a;
    };
    
    MyClass::MyClass()
    {
    }
    
    MyClass::~MyClass()
    {
    }

我们可以在类之外声明构造函数。
为什么我可以在类之外声明构造函数,为什么我们应该这样做?

4

6 回答 6

18

您不能在类之外声明构造函数。您正在谈论构造函数定义

class MyClass
{
public:
    MyClass(); // declaration

};

MyClass::MyClass() // definition
{
}

你应该读这个

您应该在类之外定义构造函数的主要原因是为了可读性。在 Header 文件中声明你的类并在源文件中定义它会更清晰。您可以将此规则应用于您班级的任何成员。


来自标准的一点引用:

12.1 构造函数

struct S {
    S();   // declares the constructor
};

S::S() { } // defines the constructor
于 2013-08-07T13:23:17.620 回答
8

你不能。这是构造函数声明,必须在类定义中:

// MyClass definition, possibly in .h file
class MyClass
{
 public:
  MyClass(); // default constructor declaration
  ...
};

这是构造函数的定义

 // MyClass default constructor definition, possibly in .cpp file
MyClass::MyClass() { }

您指的是构造函数的定义。您可以在类定义之外定义它,以允许您将一个与另一个分离。通常这意味着您将类定义放在一个头文件中,以包含在客户端代码中,并将构造函数定义(以及其他类成员函数定义)放在一个被编译的实现文件中。这样,您的代码的用户对所述定义没有编译时间依赖性。

于 2013-08-07T13:20:38.910 回答
7

在类声明之外定义构造函数(或任何成员函数)的主要原因是您可以拥有一个头文件和一个实现文件。这使您的代码更易于阅读,并允许您将接口分发给您的类(头文件),而无需提供实现细节。

于 2013-08-07T13:23:25.227 回答
1
您不能在它之外声明构造函数或类的任何部分,但您可以定义

这是一种常见的 C++ 编程实践,即为1 个类使用 2 个文件
例如,

类G.h

class ClassG
{
public:
ClassG();
~ClassG();
void anyfunc(int anyarg);
private:
int anydata;
};

类G.cpp

#include"ClassG.h"
ClassG::ClassG()
{
//something
}
ClassG::~ClassG()
{
//something
}
void ClassG::anyfunc(int anyarg)
{
//something
}

一般语法

声明时,在 .h 文件类型returntype methodname(args_if_any);
中 在 .cpp 文件类型中定义时returntype ClassName::methodname(args_if_any){}

于 2013-08-07T13:33:41.173 回答
0

首先,您的术语混淆了,您需要阅读What is the difference between a definition and a declaration?. 您不能declare在类之外创建构造函数,但可以define在类之外创建。

因此,按照您的意思提出问题:

为什么我可以在类之外定义一个构造函数

基本上,该标准在 section 中有关于member functions 的说法9.3.2

成员函数可以在其类定义中定义(8.4),在这种情况下,它是一个内联成员函数(7.1.2),或者如果它已经被声明但未在其类定义中定义,则它可以在其类定义之外定义类定义。

所以标准说这没问题,下一个问题:

为什么我们应该这样做?

它使您的代码更清晰,更易于消化,您可以将声明分成头文件,将实现分成源文件。This previous thread为什么在 C++ 中有头文件和 .cpp 文件?更详细地讨论这个话题。

于 2013-08-07T13:48:12.233 回答
0

是的,无论您使用的是 .h 文件还是 .cpp 文件,您都可以在类中定义构造函数。实际上这两个文件之间的主要区别是,头文件从不编译它仅用于在编译 .cpp 文件期间检查语法。

默认情况下在类内定义的方法是内联函数。如果您在类中定义一个构造函数,那很好,但是,如果您需要定义多个构造函数,则会出现 2 个问题

问题1:
众所周知,当您调用内联函数时,它会将代码粘贴到被调用函数中,这会增加代码大小并需要更多内存。

问题2:降低代码的可读性。

于 2013-08-07T14:36:21.757 回答