构造函数vs析构函数添加default关键字

我们都知道c++中析构函数和构造函数时干嘛的,此时我们对其加上c++11的新特性default看一下,如下1

class A{
	A() = default;//构造
	~A() = default;//析构

};

class A{
	A(){};
};

对于加default和加{}非虚函数完全不一样,我们先看下面的一个例子,这个例子在C++11标准里面完全合法,在C++的编译器眼里这个class是trivial-type

class A{
    public:    
        int foo;
    };

里面没有任何构造函数和析构函数,编译器会自动的生成一个构造函数给这个class,然后在class A实例化后,给这个A对象分配内存包括foo
假设我们给构造函数加上{}后这个class在C++编译器的眼里就变成User-provided

class A{
    public:    
        A(){};
    };

但是我们加上关键字=default呢?在编译器眼里它也变成trivial-type,

class A{
    public:    
        A() = default;
    };

为啥上面的代码也变成 trivial-type? 因为是你告诉编译器去自动生成构造函数 2

一个trivial-type和非trivial class的区别是,前者(trivial-type)只是简单的内存memcpy,而非trivial则不是
举个例子:我们的类中有虚函数,我们知道虚函数在初始化的时候不是分配内存那么简单,他有非常多隐式的初始化操作,比如初始化虚表等等操作,这些在trivial-type里面不会进行,而在user-provided里会进行

假如我们的class里面有虚函数,在初始化的时候假设class是user-provided的那么会初始化虚表等东西,正常一个类假设类中有虚函数在实例化的时候会有自己的虚表,如果这个虚函数是从父类中继承的,那么虚表中这个继承而来的虚函数指向同一个函数地址

对于析构函数也是的,正常user-provided析构函数会清除虚表等东西,但是trivial-type的class只会机械的清除内存


  1. 参考文献 ↩︎

  2. 参考文献 ↩︎

你可能感兴趣的:(c/c++,c++)