【问题标题】:Why can I declare constructor out of the class为什么我可以在类中声明构造函数
【发布时间】:2013-08-07 13:19:30
【问题描述】:

考虑一下link。请参阅此代码:

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

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

【问题讨论】:

标签: c++


【解决方案1】:

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

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

};

MyClass::MyClass() // definition
{
}

您应该阅读this

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


来自标准的一点引用:

12.1 构造函数

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

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

【讨论】:

    【解决方案2】:

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

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

    这是构造函数的定义

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
        你不能在它之外声明构造函数或类的任何部分,但你可以定义

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

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

        【讨论】:

          【解决方案5】:

          首先,您对术语感到困惑,您需要阅读What is the difference between a definition and a declaration?。你不能 declare 类外的构造函数,但你可以 define 类外的构造函数。

          按照你的意思回答问题:

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

          基本上,该标准在9.3.2 部分中对member functions 有这样的说法:

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

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

          我们为什么要这样做?

          它使您的代码更简洁,更易于消化,您可以将声明分成头文件,将实现分成源文件。之前的帖子Why have header files and .cpp files in C++? 更详细地探讨了这个主题。

          【讨论】:

            【解决方案6】:

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

            您在类中定义的方法,默认为内联函数。如果你定义一个 类中的构造函数很好,但是,如果您需要定义多个 构造函数然后出现2​​个问题

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

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

            【讨论】:

              猜你喜欢
              • 2021-06-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-08-26
              • 1970-01-01
              • 2018-07-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多