当一个对象拥有的资源是由指针指示的堆时,默认复制构造函数是能进行指针(地址)复制,而不能实现内存分配的。
用一个对象初始化另一个对象时,只复制了数据成员,而没有复制资源,使两个对象同时指向同一资源的复制方式称为浅复制。如果对象值拥有基本的数据类型资源,则程序不会出错。当对象需要占用堆资源时(动态分配内存时),程序员需要在类中显式定义复制构造函数,对资源进行深复制。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Person
{
public:
Person()
{}
//初始化属性
Person(char * name,int age)
{
m_Name = (char*)malloc(strlen(name) + 1);
strcpy(m_Name, name);
m_age = age;
}
//拷贝构造 系统会提供默认拷贝构造,而且是简单的值拷贝
//自己提供拷贝构造,原因简单的浅拷贝会释放堆区空间两次,导致挂掉
//深拷贝
Person(const Person&p)
{
m_age = p.m_age;
m_Name = (char*)malloc(strlen(p.m_Name) + 1);
strcpy(m_Name, p.m_Name);
}
~Person()
{
cout << "析构函数调用" << endl;
if (m_Name!=NULL)
{
free(m_Name);
m_Name = NULL;
}
}
//姓名
char * m_Name;
//年龄
int m_age;
};
void test01()
{
Person p1("敌法",10);
Person p2(p1); //调用拷贝构造
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}