C++为什么“没有调用”构造,但却调用了析构——其实调用了

C++忽略了默认复制构造函数造成的疑惑:为什么“没有调用”构造,但却调用了析构

提前说一下,不是没有调用,所有对象创建时,一定调用,但是某些情况下会调用系统生成的构造

先来看一段诡异的代码:

class A {
private:
    int a;
public:
    A(int a = 0);
    ~A();
};

A::A(int a) {
    this->a = a;
    cout << this << "调用构造" << endl;
}

A::~A() {

    cout << this << "调用析构" << endl;
}

A function(A obj) {
    return obj;
}

int main() {

    A obj;
    function(obj);
    return 0;
}

输出:

0136F7C4调用构造
0136F6E0调用析构
0136F6F8调用析构
0136F7C4调用析构

原因:

  1. 创建对象(分配空间)不一定调用构造?一定调用,有可能调用系统生成的
  2. 释放空间一定调用析构(除定位new分配的对象需要显式调用)

 

1.并不是所有对象创建都要调用构造?错误,原因如下

上述代码中,只有obj创建时调用了构造函数? 其实不是

函数function(A obj),这里的obj是个局部变量,它在创建的时候,隐式的进行了赋值(main()中的obj),同类对象之间赋值,会调用系统生成的复制构造函数

函数返回一个值,也就是生成了一个临时的对象存储返回值,这个时候,也进行了隐式的赋值(调用复制构造)

2.对象单元一但释放,就要调用析构函数

0136F7C4调用构造            <<main()中obj调用构造
0136F6E0调用析构            <<释放function()中obj
0136F6F8调用析构            <<释放返回值所占的临时空间
0136F7C4调用析构            <<释放main()中obj

3.给上述例子加一个默认的复制构造函数

A::A(A &obj) {
    cout << this << "调用构造" << endl;
}

输出:

00D6F78F调用构造            <<main()中obj调用构造
00D6F68C调用构造            <<function()中obj调用构造
00D6F687调用构造            <<返回值临时变量调用构造
00D6F68C调用析构            <<释放function()中obj
00D6F687调用析构            <<释放返回值的临时变量
00D6F78F调用析构            <<释放main()中obj

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/89182529