分别定义和声明默认构造函数/析构函数的一点(例如,更快的编译速度)吗?我遇到了这种设计,但我不明白为什么有人不仅仅将其保存在.hpp文件中。
// A.hpp
class A
{
public:
A();
~A();
};
// A.cpp
#include "A.hpp"
A::A() = default;
A::~A() = default;
答案 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
的构造函数会使类型变得不平凡。