C++笔记——拷贝构造函数

深拷贝与浅拷贝。

#include <iostream>
using namespace std;
#include <string>

//Example  1(浅拷贝)——正确
class Person
{
public:
	Person(int age):m_age(age)
	{
		
	}
	void print()
	{
		cout << "My age is:" << m_age << endl;
	}
private:
	int m_age;
};


int main()
{
	Person Tom(10);
	Tom.print();//My age is 10

	Person Jim(Tom);
	Jim.print();//My age is 10
	return 0;
	//没有定义相应的拷贝构造函数,编译器将会自动生成一个默认的拷贝构造函数。
    //默认拷贝构造函数所做的工作是,将一个对象的全部数据成员赋值给另一个对象的数据成员。
    //C++把只对象数据成员简单赋值这种情况称为“浅拷贝”。
}


//Example  2(浅拷贝)——错误
class Person
{
public:
	Person(int age,char* name)
	{
		m_age = age;
		m_name = new char[strlen(name)+1];
		if(m_name != NULL)
		{
			strcpy(m_name,name);
		}
		cout << m_name << "的构造函数" << endl;
	}
	~Person()
	{
		cout << "析构姓名:" << m_name << endl;
		if(m_name != NULL)
		{
			delete m_name;
		}
	}
	void print()
	{
		cout << "My age is:" << m_age << ",my name is:" << m_name << endl;
	}
private:
	int m_age;
	char* m_name;
};

int main()
{
	Person Tom(10,"Tom");//构造Tom
	Tom.print();

	Person Jim(Tom);//构造Jim,只是将Tom的成员(Tom.m_age,Tom.m_name)简单赋值给Jim相应的成员。
	Jim.print();
	//Jim先析构,再析构Tom时出问题了!Tom.m_name和Jim.m_name指向同一内存空间
	//因为这段内存空间在Jim的析构函数中已经释放过了,在释放Tom.m_name所指的内存空间时会出现问题

	return 0;
}


//Example  3(深拷贝)——正确
class Person
{
public:
	Person(int age,char* name)
	{
		m_age = age;
		m_name = new char[strlen(name)+1];
		if(m_name != NULL)
			strcpy(m_name,name);
		cout << m_name << "的构造函数" << endl;
	}
	Person(const Person& per)
	{
		m_age = per.m_age;
		m_name = new char[strlen(per.m_name)+1];
		if(m_name != NULL)
			strcpy(m_name,per.m_name);
		cout << m_name << "的拷贝构造函数" << endl;
	}
	~Person()
	{
		cout << "析构姓名:" << m_name << endl;
		if(m_name != NULL)
			delete m_name;
	}
	void print()
	{
		cout << "My age is:" << m_age << ",my name is:" << m_name << endl;
	}
private:
	int m_age;
	char* m_name;
};

int main()
{
	Person Tom(10,"Tom");//构造Tom
	Tom.print();

	Person Jim(Tom);//构造Jim
	Jim.print();
	//析构Jim,再析构Tom
	return 0;
}

//深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,
//资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。实际中应该避免浅拷贝。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值