丰富的构造函数定义和声明分开

时间:2019-04-30 09:45:32

标签: c++ constructor

分别定义和声明默认构造函数/析构函数的一点(例如,更快的编译速度)吗?我遇到了这种设计,但我不明白为什么有人不仅仅将其保存在.hpp文件中。

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

2 个答案:

答案 0 :(得分:5)

考虑使用智能指针实现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

答案 1 :(得分:2)

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

声明中默认构造函数/析构函数与定义之间存在差异。前者可以是noexcept automatically,而后者必须用noexcept声明。而且,未声明default的构造函数会使类型变得不平凡。