【问题标题】:Default constructor/destructor outside the class?类外的默认构造函数/析构函数?
【发布时间】:2012-12-24 18:28:30
【问题描述】:

根据 C++11 标准,以下内容是否合法(类定义之外的= default)?

// In header file
class Test
{
    public:
        Test();
        ~Test();
};

// In cpp file
Test::Test() = default;
Test::~Test() = default;

【问题讨论】:

  • 这很好,标准甚至在示例中使用它 (§8.4.2/3)。 = default= delete 只是“普通”函数体(无论如何,按照规范),即你在定义中写的内容。
  • 请注意,默认定义可以出现在函数的第一个声明之后,而删除的定义必须是函数的第一个声明。
  • @Xeo 听起来像是一个答案。
  • 请注意,以这种方式默认的构造函数,仍然是用户提供的构造函数。因此,您的课程Test 不是一个微不足道的课程。见stackoverflow.com/a/7169675/396551

标签: c++ c++11 constructor destructor default-constructor


【解决方案1】:

是的,可以在 .cpp 文件中默认定义一个特殊的成员函数。意识到这样做,内联默认函数的某些属性将不适用于您的类。例如,如果您的复制构造函数是默认定义的外联,则您的类将不会被视为可简单复制(这也使其无法被识别为 POD)。类似地,默认定义的外联析构函数将使您的类型失去平凡(或 POD)的资格。

如果您希望有一个非内联复制构造函数并控制它的定义位置(也许控制它需要的生成的模板定义),但不希望自己手动定义它,这可能很有用使用手工制作的成员初始化器列表,这会很费力并且在维护时可能会过时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多