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();
}