• (转载)C++中, 构造函数和析构函数能不能被显示调用?


    (转载)http://blog.csdn.net/zhangxinrun/article/details/6056321

    代码: 
    view plaincopy to clipboardprint?
    #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对象在这里被销毁.   
    }  
    #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对象在这里被销毁.

    输出: 
    view plaincopy to clipboardprint?
    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>  
    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();) . 
    显示调用构造函数和析构函数就像调用一般的函数一样, 并不意味着创建或销毁对象; 
    如果构造函数中动态分配了空间, 则显示调用构造函数会造成内存泄露. 创建对象时的隐式构造函数调用已经为对象分配了动态内存. 当用创建好的对象显示调用构造函数时, 对象指向的动态内存更新显示调用时所分配的, 对象生命周期结束时析构函数所释放掉的是后一次分配的动态内存, 也就是说创建对象时隐式构造函数调用所分配的那块内存泄漏了. 
    如果析构函数中释放动态分配的空间, 则会造成多次释放同一内存, 会出现严重错误.


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/g5dsk/archive/2009/11/06/4775089.aspx

  • 相关阅读:
    stm32 fatfs 文件系统分析和代码解析
    STM32 USB协议和代码分析
    微型跟踪器A产品体验和分析
    辅听一号产品体验和测评
    华为sound x智能音箱初体验
    TPC-H 分析
    论文解析 -- TPC-H Analyzed: Hidden Messages and Lessons Learned from an Influential Benchmark
    Calcite分析 -- Cost
    Calcite分析 -- ConverterRule
    Calcite分析 -- TopDownRuleDriver
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3290402.html
Copyright © 2020-2023  润新知