C++中, 构造函数和析构函数能不能被显示调用?

#include <iostream>
using namespace std;

class A
{
public:
    A()
    {
        cout << "Default constructor is called./r/n";
    }

    A(int ix)
    {
        cout << "Another constructor is called./r/n";
    }

    ~A()
    {
        cout << "Destructor is called./r/n";
    }
};

int main()
{
    A a1;          // <1>
    a1.A::A();     // <2> 显示调用默认构造函数(写成a1.A()会报错)
    a1.A::A(7);    // <3> 显示调用非默认构造函数(写成a1.A(7)会报错)
    a1.A::~A();    // <4> 显示调用析构函数, 但是此时对象a1并没有销毁(写成a1.~A()不会报错)

    // A a2();     // 这样写没报错, 但也没调用任何构造函数和析构函数.
    A a3 = A();    // <5> 完整写法: A a3 = A::A();
    A a4(77);      // <6>
    A a5 = A(777); // <7> 完整写法: A a5 = A::A(777);

    return 0;
    // <8>, <9>, <10>, <11> return语句之后, 右括号之前析构函数被隐式调用. a1, a3, a4, a5对象在这里被销毁.

输出:  
Default constructor is called. // <1>
Default constructor is called. // <2>
Another constructor is called. // <3>
Destructor is called.          // <4>
Default constructor is called. // <5>
Another constructor is called. // <6>
Another constructor is called. // <7>
Destructor is called.          // <8>
Destructor is called.          // <9>
Destructor is called.          // <10>
Destructor is called.          // <11> 
总结:  
C++中, 构造函数和析构函数可以被显示调用. 显示调用默认构造函数的语法: a.A::A();(不能写成a.A();) , 显示调用非默认构造函数的语法: a.A::A(7);(不能写成a.A(7);); 显示调用析构函数的语法: a.A::~A();(可以写成a.~A();) . 
显示调用构造函数和析构函数就像调用一般的函数一样, 并不意味着创建或销毁对象; 
如果构造函数中动态分配了空间, 则显示调用构造函数会造成内存泄露. 创建对象时的隐式构造函数调用已经为对象分配了动态内存. 当用创建好的对象显示调用构造函数时, 对象指向的动态内存更新显示调用时所分配的, 对象生命周期结束时析构函数所释放掉的是后一次分配的动态内存, 也就是说创建对象时隐式构造函数调用所分配的那块内存泄漏了. 
如果析构函数中释放动态分配的空间, 则会造成多次释放同一内存, 会出现严重错误.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值