我最初将其发布为仅关于析构函数的问题,但现在我正在添加对默认构造函数的考虑。这是原始问题:
如果我想给我的类一个虚拟的析构函数,但与编译器生成的析构函数相同,我可以使用=default: class Widget { public: virtual ~Widget() = default; }; 但似乎我可以通过使用空定义减少输入来获得相同的效果: class Widget { public: virtual ~Widget() {} }; 这两个定义有什么不同的表现吗?
如果我想给我的类一个虚拟的析构函数,但与编译器生成的析构函数相同,我可以使用=default:
=default
class Widget { public: virtual ~Widget() = default; };
但似乎我可以通过使用空定义减少输入来获得相同的效果:
class Widget { public: virtual ~Widget() {} };
这两个定义有什么不同的表现吗?
根据针对此问题发布的回复,默认构造函数的情况似乎相似。鉴于析构函数的“ =default”和“ {}”之间的含义几乎没有区别,那么默认构造函数的这些选项之间的含义是否也几乎没有区别?也就是说,假设我想创建一个类型,该类型的对象将被创建和销毁,我为什么要说
{}
Widget() = default;
代替
Widget() {}
?
如果在原始发布后扩展此问题违反了某些 SO 规则,我深表歉意。为默认构造函数发布一个几乎相同的问题让我觉得不太理想。
当询问构造函数而不是析构函数时,这是一个完全不同的问题。
如果您的析构函数是virtual,那么差异可以忽略不计。但是,如果您的析构函数是 non-virtual,那就完全不同了。构造函数也是如此。
virtual
对特殊成员函数(默认构造函数、复制/移动构造函数/赋值、析构函数等)使用= default语法意味着与简单地做{}. 使用后者,该功能变为“用户提供”。这改变了一切。
= default
这是 C++11 定义的一个微不足道的类:
struct Trivial { int foo; };
如果您尝试默认构造一个,编译器将自动生成一个默认构造函数。复制/移动和破坏也是如此。因为用户没有提供任何这些成员函数,C++11 规范认为这是一个“微不足道的”类。因此这样做是合法的,比如 memcpy 它们的内容以初始化它们等等。
这个:
struct NotTrivial { int foo; NotTrivial() {} };
顾名思义,这不再是微不足道的。它有一个用户提供的默认构造函数。是否为空也没关系;就 C++11 的规则而言,这不可能是微不足道的类型。
struct Trivial2 { int foo; Trivial2() = default; };
顾名思义,这是一种微不足道的类型。为什么?因为您告诉编译器自动生成默认构造函数。因此构造函数不是“用户提供的”。因此,该类型算得上是微不足道的,因为它没有用户提供的默认构造函数。
当您添加阻止创建此类函数的成员函数时,该= default语法主要用于执行复制构造函数/赋值之类的操作。但它也会触发编译器的特殊行为,因此它在默认构造函数/析构函数中也很有用。