(一) 拷贝构造函数的调用
建一个包含拷贝构造函数的类
class A
{
public:
A(){
m_x=1;
m_y=2;
}
~A(){}
A(const A &obj){
m_x=obj.m_x;
m_y=obj.m_y;
cout<<"调用拷贝函数"<<endl;
}
private:
int m_x;
int m_y;
};
1、用一个对象初始化另一个对象
int main()
{
A test;
A test1(test);
A test2=test;
A test3=A(test);
system("pause");
return 0;
}
2、当函数形参是对象时
void printT(A test)
{
cout<<"函数调用"<<endl;
}
int main()
{
A test;
printT(test);
system("pause");
return 0;
}
实参到形参的传递是一个拷贝的过程,对象作为形参时,可以使用指针或引用,避免调用拷贝构造函数。
函数返回一个对象时,会产生一个匿名对象,用返回对象对匿名对象进行初始化,调用匿名对象的拷贝函数。
(二)深拷贝,浅拷贝
浅拷贝
s1调用普通构造函数进行构造,对象s2使用s1对其初始化,会调用s2的拷贝构造函数,没有写拷贝构造函数会使用默认的拷贝构造函数,默认的拷贝构造函数知识对成员数据进行简单的复制,复制后的内存如图所示,指针指向堆上的同一个空间。
进行析构时,会先析构后构造的s2,这是s2指向堆内的空间,会将堆内的空间释放掉,而后释放s1,s1的数据成员指针也不为null,所以会去释放所指向的堆空间,但是这块空间已经被释放掉了,s1再次释放会发生错误。
深拷贝
各指向堆上的一段空间,不会影响。