C++类与对象--拷贝构造
1. 拷贝构造的定义及意义
由己存在的对象,创建新对象。也就是说新对象,不由构造器来构造,而是由拷贝构造器来完成。拷贝构造器的格式是固定的。
class 类名
{
类名(const 类名 & another)
拷贝构造体
}
class A
{
A(const A & another)
{}
}
规则:
- 系统提供默认的拷贝构造器。一经实现,不复存在。
- 系统提供的是等位拷贝,也就是所谓的浅拷贝。
- 要实现深拷贝,必须要自定义。
ps:浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
2. 拷贝构造发生的时机
- 制作对象的副本。
- 以对象作为参数和返回值。
3. 深拷贝和浅拷贝
系统提供默认的拷贝构造器,一经定义不再提供。但系统提供的默认拷贝构造器是等位拷贝,也就是通常意义上的浅拷贝。如果类中包含的数据元素全部在栈上,浅拷贝也可以满足需求的。但如果是堆上的数据,则会发生多次析构行为。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
class A
{
public:
A(int d,char *p):data(d)
{
pd = new char[strlen(p)+1];
strcpy(pd,p);
}
~A()
{
delete[]pd;
}
A(const A& another)
{
pd = new char[strlen(another.pd)+1];
strcpy(pd,another.pd);
data=another.data;
cout<<"gz"<<endl;
}
A& operator=(const A& another)
{
pd = new char[strlen(another.pd)+1];
strcpy(pd,another.pd);
data=another.data;
cout<<"cz"<<endl;
}
void dis()
{
cout<<data<<" "<<pd<<endl;
}
public:
int data;
char *pd;
};
int main()
{
A a(20,"china");
A c(21,"china");
A b(a);
A d = b;
d.dis();
c = b;
c.dis();
return 0;
}
默认的拷贝构造函数是浅拷贝,默认的赋值“=“也是浅拷贝。而A b(a) 和 A d = b调用的自定义拷贝构造函数A(const A& another),c = b调用赋值“=”的重载,都是深拷贝。