拷贝构造函数和赋值函数的区别:

例如:一个类叫做:"myclass",并有一个实例b

那么

(1) myclass a=b; 拷贝构造函数

(2)myclass a; a=b; 赋值构造函数

 

两者调用的时间不一样:

第一种情况下,a此时还没有被分配空间,在赋值的同时还要生成资源

第二种情况下,a构造完成,已经有了资源,所以此时等号只进行赋值。

其次继续看:

如果函数返回值是一个对象,考虑return语句的效率。例如return String(s1+s2);

这是临时对象的语法,表示“创建一个临时对象并返回它”。不要以为它与“先创建一个局部对象temp并返回它的结果”是等价的,如

String temp(s1 + s2);

return temp;

实质不然,上述代码将发生三件事:

首先,temp对象被创建,同时完成初始化;

然后,拷贝构造函数把temp拷贝到保存返回值的外部存储单元中;

最后,temp在函数结束时被销毁(调用析构函数)。

然而“创建一个临时对象并返回它”的过程是不同的,编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的开销,提高了效率。

类似地,我们不要将

return int(x + y);  // 创建一个临时变量并返回它

写成

int temp = x + y;

return temp;

由于内部数据类型如int, float, double的变量不存在构造函数与析构函数,虽然该“临时变量的语法”不会提高多少效率,但是程序更加简洁易读。

 

最后来看深拷贝与浅拷贝

拷贝有2种,深拷贝与浅拷贝。

当出现类的等号赋值的时候,会调用拷贝函数。

在未定义显示拷贝构造函数情况下,系统会调用默认的拷贝函数——浅拷贝,它能够完成成员的一一复制,当数据成员中没有指针时,浅拷贝是可行的

但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一地址,当对象块结束时,会调用2次析构函数,从而导致指针悬挂现象,这时必须采用深拷贝

深拷贝与浅拷贝的区别在于:

深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂问题。

 

总之一句话:

深拷贝意味者拷贝了资源和指针,而浅拷贝只拷贝了指针,没有拷贝资源,这样使得两个指针同指向一个资源,造成同一份资源析构2次,程序崩溃。

上面为个人总结,有错误的地方望大家给我纠正。