为什么我可以在类中声明构造函数

时间:2013-08-07 13:19:30

标签: c++

考虑这个link。看到这段代码:

 class MyClass
    {
    public:
        MyClass();
        ~MyClass();

    private:
        int _a;
    };

    MyClass::MyClass()
    {
    }

    MyClass::~MyClass()
    {
    }

我们可以在类中声明构造函数 为什么我可以在类中声明构造函数以及为什么要这样做?

6 个答案:

答案 0 :(得分:13)

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

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

};

MyClass::MyClass() // definition
{
}

您应该阅读this

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


标准的一点引用:

  

12.1构造函数

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

S::S() { } // defines the constructor

答案 1 :(得分:7)

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

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

这是构造函数定义

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:1)

您不能声明构造函数或类之外的任何部分,但您可以定义

这是一种常见的c ++编程实践,使用 2个文件进行1类
例如,

ClassG.h

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

ClassG.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){}

答案 4 :(得分:0)

首先,你的术语很混乱,你需要阅读What is the difference between a definition and a declaration?。你不能declare一个类之外的构造函数,但你可以在类之外define

就像你的意思那样问题:

  

为什么我可以在类

之外定义构造函数

基本上标准对member function部分中9.3.2的说法如下:

  

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

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

  

为什么我们应该这样做?

它使您的代码更清晰,更容易消化,您可以将声明分隔为头文件,将实现分离为源文件。前一个帖子Why have header files and .cpp files in C++?更详细地讨论了这个主题。

答案 5 :(得分:0)

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

默认情况下在内部函数中定义的方法。如果你定义一个 在类中的构造函数没关系,但是,如果你需要定义多个 构造函数然后发生2个问题

问题1:
我们知道,当你调用内联函数时,它会粘贴被调用的代码 增加代码大小并需要更多内存的函数。

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