关于复制构造函数赋值函数

一、复制构造函数

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 &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、实现上不一样。复制构造函数首先是一个构造函数,它调用的时候是通过参数的对象初始化产生一个对象。赋值函数则是把一个新对象赋值给一个原有对象,所以如果原来的对象中又内存分配要先把内存释放掉,而且还要检查一下两个对象是不是同一个对象,如果是,则不作任何操作。




猜你喜欢

转载自blog.csdn.net/qq_35965090/article/details/77427054