类和对象的基础3——拷贝构造函数

1、概念:拷贝构造函数的目的就是使用已经存在的同类对象来初始化创建对象的构造函数。


2、格式:拷贝构造函数也是一种特殊的构造函数,它也有默认的拷贝函数,默认的拷贝构造函数如下:

<类名>(const <类名>  &形参对象名);

{

//实现复制

}


3、例子:用默认的拷贝构造函数实现新对象的初始化

/**************************
时间:2016年9月30日09:36:26
功能:默认拷贝构造函数
***************************/
#include <iostream>
using namespace std;

class Car
{
public:
	Car(int s)      //定义构造函数
	{
		speed = s;
	}
	~Car()   //定义析构函数
	{

	}

	void print()     //输出函数声明并进行了初始化
	{
		cout<<"The speed is:"<<speed<<endl;
	}

private:
	int speed;
};


void main()
{
	Car car1(90);
	Car car2(car1);
	car2.print();
}

4、自定义拷贝函数

(1)调用拷贝函数的情形:

a.一个对象以传值的方式传入函数体;

b.一个对象以值得传递方式从函数返回;

c.一个对象用来初始化同类型的对象。


 (2)自定义拷贝函数存在的意义:

a.阻止调用默认拷贝函数,有时默认拷贝函数会带来意想不到的错误;

b.拷贝自己所需的部分即可,这样提高了程序的效率。


5、深拷贝和浅拷贝的区别:是否拷贝动态申请的内存,如果是则为深拷贝,如果不是则为浅拷贝。


6、例子:利用自定义拷贝函数来实现数据的拷贝并区分深浅拷贝

/***********************************
时间:2016年9月30日11:28:53
功能:自定义拷贝函数用于区分深浅拷贝
*************************************/
#include <iostream>
using namespace std;

class Car
{
public:
	Car(int s,char n[]);
	Car(const Car& c);     //自定义拷贝函数
	void move();
private:
	int speed;
	char *p;
};

//Car类的实现部分
Car::Car(int s,char n[])
{
	speed = s;
	p = new char[20];
	strcpy(p,n);
	cout<<"in car class construct function"<<endl;
}

Car::Car(const Car& c)    //自定义拷贝函数的实现
{
	speed = c.speed;
	p = new char[20];
	strcpy(p,c.p);            //实现了动态内存区域的拷贝,故为深拷贝
	cout<<"in car class copy construct"<<endl;
}

void Car::move()
{
	cout<<p<<"moves in "<<speed<<endl;
}

class Plane
{
public:
	Plane(int s,char []);
	Plane(const Plane& p);    //自定义拷贝函数,p为形参
	void move();

private:
	int speed;
	char name[20];
};

//Plane类的实现
Plane::Plane(int s,char n[])
{
	speed = s;
	strcpy(name,n);
	cout<<"in plane class construct function"<<endl;
}

Plane::Plane(const Plane& p)    //拷贝函数的实现
{
	speed = p.speed;
	strcpy(name,p.name);
	cout<<"in plane class copy construct function"<<endl;
}

void Plane::move()
{
	cout<<name<<"move in "<<speed<<endl;
}

void main()
{
	Car car1(60,"a car ");
	Plane plane1(200,"a plane ");
	Car car2 = car1;
	Plane plane2 = plane1;
	car2.move();
	plane2.move();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路漫求索_CUMT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值