【问题标题】:Separating constructor definition and declaration when are defult [duplicate]何时分离构造函数定义和声明[重复]
【发布时间】:2019-09-18 22:53:07
【问题描述】:

默认构造函数/析构函数的单独定义和声明是否有任何意义(例如更快的编译)?我遇到过这样的设计,我不明白为什么有人不把它保存在 .hpp 文件中。

// A.hpp
class A
{
public:
    A();
    ~A();
};
// A.cpp
#include "A.hpp"
A::A() = default;
A::~A() = default;

【问题讨论】:

    标签: c++ constructor


    【解决方案1】:

    考虑使用智能指针实现的 PIMPL 习惯用法:

    // X.h:
    class X {
      class Impl;
      std::unique_ptr<Impl> pimpl_;
    public:
      ~X() = default;
      ...
    };
    

    在源代码中包含这样的头文件会导致编译错误,因为X::Impl 在那里是不完整的类型,因此无法删除。

    解决方案是将析构函数定义移到源中:

    // X.h:
    class X {
      class Impl;
      std::unique_ptr<Impl> pimpl_;
    public:
      ~X();
      ...
    };
    

    加号:

    // X.cpp:
    class X::Impl { ... };
    
    X::~X() = default;  // X::Impl is complete here
    

    【讨论】:

      【解决方案2】:

      这样做是为了避免内联构造函数和析构函数。一个原因是当智能指针的成员指向不完整类型时,它们的定义仅在 .cpp 文件中可用。

      声明定义中的默认构造函数/析构函数是有区别的。前者可以是noexcept automatically,而后者必须用noexcept 声明。此外,未声明default 的构造函数使类型变得不平凡。

      【讨论】:

        猜你喜欢
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        • 2019-07-07
        • 2018-07-03
        • 2021-06-04
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        相关资源
        最近更新 更多