C++ 类外的默认构造函数/析构函数?

C++ 类外的默认构造函数/析构函数?,c++,c++11,constructor,destructor,default-constructor,C++,C++11,Constructor,Destructor,Default Constructor,根据C++11标准(=default超出类的定义),以下内容是否合法 是的,可以在.cpp文件中对特殊成员函数进行默认定义。认识到这样做,内联默认函数的某些属性将不会应用于类。例如,如果您的复制构造函数是默认定义的,那么您的类将不会被认为是可复制的(这也会取消将其识别为POD的资格)。类似地,一个默认定义的越行析构函数将取消您的类型的平凡性(或POD) 如果您希望拥有一个非内联复制构造函数并控制其定义位置(可能需要控制生成的模板定义),但不希望自己使用手工制作的成员初始值设定项列表手动定义它,那

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


是的,可以在.cpp文件中对特殊成员函数进行默认定义。认识到这样做,内联默认函数的某些属性将不会应用于类。例如,如果您的复制构造函数是默认定义的,那么您的类将不会被认为是可复制的(这也会取消将其识别为POD的资格)。类似地,一个默认定义的越行析构函数将取消您的类型的平凡性(或POD)


如果您希望拥有一个非内联复制构造函数并控制其定义位置(可能需要控制生成的模板定义),但不希望自己使用手工制作的成员初始值设定项列表手动定义它,那么这将非常有用,这会很费劲,而且在维护时可能会过时。

这很好,标准甚至在示例中使用了它(
§8.4.2/3
)<代码>=默认和
=删除
只是“正常”功能体(无论如何,根据规范),例如,在定义中写入的内容。请注意,默认定义可以出现在函数的第一次声明之后,而删除的定义必须是函数的第一次声明。@Xeo听起来像是一个答案。请注意,以这种方式默认的构造函数仍然是用户提供的构造函数。因此,您的类
Test
不是一个简单的类。看见
// In header file
class Test
{
    public:
        Test();
        ~Test();
};

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