一、复制构造函数
1、 可以用类对象初始化另一个对象,默认是通过依次复制每个非静态数据成员来实现的,也可以通过提供特殊的复制构造函数(copy constructor )来改变默认行为。复制构造函数是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构造及初始化。
如果在类中没有显式的声明一个复制构造函数,那么,编译器会私下里制定一个函数来进行对象之间的位复制(bitwise copy)。这个隐含的复制构造函数简单地关联了所有的类成员。
在C++中,3中对象需要复制,在以下过程中,复制构造函数将被调用。
(1)一个对象以值传递的方式传入函数体。
(2)一个对象以值传递的方式从函数返回。
(3)一个对象需要通过另外一个对象进行初始化。
如下面代码:
#include<iostream>
using namespace std;
class Copy
{
public:
int a;
Copy(int x)
{
a=x;
}
Copy(Copy ©)//复制构造函数
{
cout<<"copy constuctor!"<<endl;
a=copy.a;
}
};
void fun1(Copy copy)//(1) 值传递传入函数体
{
cout<<"fun1(Copy )"<<endl;
}
Copy fun2()// (2)值传递从函数体返回
{
Copy c(3);
cout<<"fun2()"<<endl;
return c;
}
int main()
{
Copy c1(5);
Copy c2=c1;//用c1对c2进行初始化
cout<<"first fun1()..."<<endl;
fun1(c1);
Copy c3=fun2();
cout<<"second fun2()..."<<endl;
return 0;
}
输出结果:
2、深复制和浅复制
深复制:为新对象制作了外部对象的独立复制;
浅复制:是让新旧两个对象指向同一个外部内容。
3、复制构造函数的理解
如果用户没有定义复制构造函数,并在代码中使用到了复制构造函数,编译器就会生成默认的复制构造函数;但是如果用户定义了复制构造函数,编译器就不会再生成复制构造函数了。
如果用户定义了一个构造函数,但不是复制构造函数,而此时在代码中又使用到了复制构造函数,编译器也还会生成默认的复制构造函数。
二、 赋值函数
当一个类对象向该类的另一个对象的赋值操作时,需要用到该类的赋值函数
三 、复制构造函数与赋值函数的区别:
1、复制构造函数是一个对象初始化一块区域,这块内存就是新对象的内存区;例如:
class A;
A a;
A b=a;//调用复制构造函数
A b(a);//调用复制构造函数
而赋值函数是对于一个已经被初始化的对象来进行赋值操作;例如:
class A;
A a;
A b;
b=a; //调用赋值函数
2、一般来说在数据成员包含指针对象时,应考虑两种不同的处理需求:一种是复制指针对象,另一种是引用指针对象。复制构造函数大多是情况下是复制,赋值函数是引用对象。
3、实现上不一样。复制构造函数首先是一个构造函数,它调用的时候是通过参数的对象初始化产生一个对象。赋值函数则是把一个新对象赋值给一个原有对象,所以如果原来的对象中又内存分配要先把内存释放掉,而且还要检查一下两个对象是不是同一个对象,如果是,则不作任何操作。