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

原文地址:https://www.cnblogs.com/w413133157/p/1653600.html