• C++构造函数和析构函数以及复制构造函数的调用问题


    本文描述个人对C++构造函数和析构函数何时调用的一些总结。

    首先定义一个简单的class Test{

      int m_i;
      int m_j;
    public:
      Test()
      {
        cout<<"Test()"<<endl;
      }

      Test(const Test* object)
      {
        cout<<"
    Test(const Test* object)"<<endl
      }
      Test(
    int v)   {     cout<<"Test(int v)"<<endl;   }   ~Test()   {     cout<<"~Test()"<<endl;   } };

    第一种情况,直接调用。接下来看代码

    int main()
    {
        Test a;
        Test b(1);
        Test c=5;
        Test d=c; 
    //    Test d();
         
        cin.get();
    }

    这里需要特别注意Test  d()这行,这里C++编译器是将它作为一个函数声明来实现的,实际上 d这个类成员并没有构造成功。

     第二种情况类对象作为函数参数。

    void func()
    {
        Test a(1);
        cout<<"****************"<<endl;
        Play(a);    
        cout<<"****************"<<endl;
        Play(Test(5)); 
        cout<<"****************"<<endl;
        Play(2);
        cout<<"****************"<<endl;
        Play1(a);  
        cout<<"****************"<<endl;
    }

    我们将代码构造放在函数中实现,更方便查看析构的调用情况。

    我分别用了四种方式尝试函数传入类对象。

    1.先构造一个类,将他作为函数实参。

    2.函数实参是一个类对象的构造。

    3.函数实参是一个整数。

    4.函数实参是一个类引用,引用一个类对象。

    我们将代码运行后结果如下

     

    可以看到

    第一种情况会进行一次复制操作和俩次析构操作。

    而第四种情况引用传递类对象则进行一次析构。

    而二三两种情况效果相同,都只是进行一次构造和两次析构。

    第三种情况类作为返回值

    Test func()
    {
        Test a(1);
        return a;
    }
    int main()
    {
       Test b=func();
       cout<<"*****************"<<endl;
       Test a(1);
       a=func();
    
       cin.get();
        
    }

    先看到结果

    可以看到当在类对象声明时用函数返回值给对象赋值,并没有构造发生。

    当用函数返回值给一个类对象赋值时,会调用一次构造和一次析构。原因是函数返回值会先构造一个和返回对象一样的临时类,然后将其返回,待操作结束后,释放该临时类

    总结

    1.当类直接作为函数参数时,会发生一次拷贝动作,同时进行2次析构动作。

    2.当在函数参数中直接构造一个类,或者符合C++自动构造规则的,则调用一次构造和两次析构。

    3.当类作为函数引用参数时,进行一次析构。

    4当类作为返回值时,

      如果直接在类声明处用函数返回值初始化,那么什么都不做。

      如果普通的用函数返回值赋值给一个类对象,则进行一次构造,一次析构。

     

  • 相关阅读:
    野指针
    MFC动态创建控件及其消息响应函数
    关于CString总结
    关于char, wchar_t, TCHAR, _T(),L,宏 _T、TEXT,_TEXT、L
    VS2005、VS2008中的快捷键、组合键大全
    could not be found (are you missing a using directive or an assembly reference?)
    项目任务管理系统
    VSDBCMD
    sqlcmd
    Microsoft® Command Line Utilities 11 for SQL Server®
  • 原文地址:https://www.cnblogs.com/a-lai/p/7305885.html
Copyright © 2020-2023  润新知