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