拷贝构造函数和深拷贝例子

1.拷贝构造函数也是一个构造函数,用来构造对象,只有在对象定义时起作用,其第一个参数是自身类型的引用,其他任何参数均带有默认值.(如果第一个参数不是引用类型,因为构造拷贝对象时必须调用拷贝构造函数,那么连拷贝构造函数都必须调用拷贝构造函数,结果可想而知,调用永远也不会成功)

2.如果我们没有为一个类定义一个拷贝构造函数,编译器会为我们定义一个,称之为:合成的拷贝构造函数,即使我们已经定义了其他构造函数,编译器还是会为我们合成一个拷贝构造函数。

3.拷贝构造函数定义了将一个对象赋予另一个同类型对象时的操作,即逐个拷贝(非static)数据成员,

4.调用拷贝构造函数的情况:

(1)用 = 定义一个对象

(2)将一个对象作为实参传递个一个非引用类型的对象

(3)从一个返回类型为非引用类型的函数返回一个对象

(4)用花括号初始化一个数组中的元素或一个聚合类中的成员

5.编译器有时会绕过拷贝构造函数,以提高程序运行效率。

6.当类成员中有指针类型时,最好用深拷贝,下面这个程序即为例子(在存在指针成员函数的类中,拷贝构造函数如果是简单拷贝指针的值则为浅拷贝,如果重新为该指针分配一块等值的内存则为深拷贝):

#include <iostream>
using namespace std;

class Cstr{
public:
int *a;
Cstr()
{
a = new int [3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
}

Cstr(const Cstr& str)
{
//a = str.a;                //浅拷贝,指针成员共用内存(析构函数会重复释放同一块内存,造成程序崩溃)
this->a = new int[3];
/*this->a[0] = str.a[0];                //深拷贝,为指针成员重新申请内存
this->a[1] = str.a[1];
this->a[2] = str.a[2];*/
memcpy(this->a, str.a, 12);                        //内存内容复制(目的空间,源空间,空间大小)
}
~Cstr()
{
delete[] a;
}
};

int main()
{
{
Cstr st;
cout << st.a[0] << " " << st.a[1] << " " << st.a[2]<< endl;
cout << st.a << endl;
Cstr at = st;
cout << at.a[0] << " " << at.a[1] << " " << at.a[2] << endl;
cout << at.a << endl;
}
Cst st;
*p = new Cst(st);  //也会调用拷贝构造函数
system("pause");
return 0;
}

  

原文地址:https://www.cnblogs.com/hi3254014978/p/9412269.html