zoukankan      html  css  js  c++  java
  • 类的构造函数(3)

    /*类的构造函数(3)*/

     

    /*******************类文件***********************/


    #include "stdafx.h"
    #include "A.h"

    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////

    A::A()
    {
      m_i = 0;
      m_pData = NULL;
      cout << this << "
    构造 " << endl;
    }

    A::A( int n )
    {
      m_i = n;
      m_pData = NULL;
      cout << this << "
    构造(int) " << endl;
    }

    A::~A()
    {
          Release();
          cout << this << "
    析构 " << endl;
    }

    void A::Release()
    {
       if ( m_pData  )
       {
         delete[] m_pData;
         m_pData = NULL;
       }
    }


    int A::GetData()
    {
       return this->m_i;
    }

    char* A::GetPtr()
    {
      return m_pData;
    }

    char* A::AllocSpace(int nLen)
    {
      
       Release();

       m_pData = new char[nLen];

       if ( m_pData )
       {
         memset(m_pData,0,nLen);//
    指针清零
       }

       return m_pData;
    }

    //const
    对象 ->const 对象  错误
    //
    可以用强制类型转换
    //((A&)obj).GetData()

    A::A(const A &obj)
    {
       cout << &obj << "  " << obj.m_i << endl;

       cout << this << "  
    拷贝构造函数执行" << endl;

       m_pData = NULL;
       m_i = 0;

       m_i = obj.m_i;

       //
    浅拷贝
       this->m_pData = obj.m_pData;

       //
    深拷贝(指针)
       //AllocSpace(strlen(obj.m_pData) + sizeof(char));
       //strcpy(this->m_pData,obj.m_pData);
    }

    /***********************************主文件*****************************/

    #include "stdafx.h"
    #include <iostream.h>
    #include "A.h"


    void Copy_Constuct()
    {
        //
    调用有参构造
        A obj(10);
       
        obj.AllocSpace(5);
       
        obj.GetPtr()[0] = 'A';
       
        //
    用对象obj作为参数,创建新对象(调用拷贝构造函数)
        A objcopy = obj;
       
        cout << objcopy.GetPtr() << endl;
       
        //
    释放新对象堆空间,如果是浅拷贝,原来对象的空间也删除
        //
    如何解决  深拷贝
       
        // 1.
    重写拷贝构造函数
        // 2.
    申请新空间给 新对象的指针成员
        objcopy.Release();
       
        // C++
    可以为类产生一个缺省的 拷贝构造函数
        //
    将参数代表的对象逐域拷贝到新创建的对象中
       
        //A objcopy;                        
    对象产生无参构造
       
        //memcpy(&objcopy,&obj,sizeof(obj));
    内存拷贝
       
    }

    //
    形参为类类型 产生临时对象(形参对象) 这个临时对象会调用拷贝构造函数
    //
    它的作用域 此函数 为了避免产生拷贝对象,所以用引用或是指针来作为形参比较合式
    void Copy_ConstuctFun( A obj )
    {
        cout << obj.GetData() << endl;   
    }

    //
    返回值为类类型 返回的时候会产生临时对象 这个临时对象会调用拷贝构造函数
    //
    它的作用域 由调用语句决定 //这里返回引用或是返回指针就不会产生拷贝对象了
    A Copy_ConstuctRetFun(  )
    {
        static A TempObj(20);
        return TempObj;
    }

    int main(int argc, char* argv[])
    {
        A theObj;
       
        cout << Copy_ConstuctRetFun().GetData() << endl;
       
        //Copy_ConstuctFun( theObj );
       
        //Copy_Constuct();
       
        return 1;
       
        A * pObj = new A[2];
        //A * pObj = new A(100);
       
        //
    析构函数可以显示调用
        //pObj[0].~A();
        pObj[0].Release();
       
        printf("%d\n",pObj[0].GetData());
       
        if ( pObj )
        {
            delete[] pObj;
            pObj = NULL;
        }
       
        printf("%d\n",pObj[0].GetData());
       
        return 0;
    }

  • 相关阅读:
    [SSRS] Use Enum values in filter expressions Dynamics 365 Finance and Operation
    Power shell deploy all SSRS report d365 FO
    display method in Dynamics 365 FO
    How To Debug Dynamics 365 Finance and Operation
    Computed columns and virtual fields in data entities Dynamics 365
    Azure DevOps for Power Platform Build Pipeline
    Create readonly entities that expose financial dimensions Dynamics 365
    Dataentity call stack dynamics 365
    Dynamics 365 FO extension
    Use singletenant servertoserver authentication PowerApps
  • 原文地址:https://www.cnblogs.com/w413133157/p/1653600.html
Copyright © 2011-2022 走看看