• 类的构造函数(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;
    }

  • 相关阅读:
    页面反向映射之文件页面
    页面反向映射之匿名页面
    cp so文件导致进程SIGBUS或者SEGV原因分析
    由systemtap直接修改内核代码段想到的
    epoll的内核实现
    从一些现象看printf的缓冲机制
    Linux由浅入深学习 (转)
    每天一个Linux命令 (转)
    Redis与数据库同步问题
    PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)
  • 原文地址:https://www.cnblogs.com/w413133157/p/1653600.html
Copyright © 2020-2023  润新知