运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

c++特殊构造函数详解

运维开发网 https://www.qedev.com 2022-01-09 14:23 出处:网络 作者: 隐匿269
目录前言拷贝构造函数一、什么是拷贝构造函数二、调用时机注意浅拷贝和深拷贝总结前言
目录
  • 前言
  • 拷贝构造函数
  • 一、什么是拷贝构造函数
  • 二、调用时机
  • 注意
  • 浅拷贝和深拷贝
  • 总结

前言

众所周知,构造函数的作用是类在创建对象时的初始化,而拷贝构造函数则是构造函数里的一种特殊构造。

拷贝构造函数

拷贝构造:是C++特有的,他是一种特殊的构造函数

编程客栈

用于基于一个同一个类的的第一个对象去创造和初始化的一个对象

第一的参数是本类的对象的引用(const)

一、什么是拷贝构造函数

一种特殊的构造函数,同一个类的一个对象去创造或初始化一个对象

在没写的时候,是默认存在的,自己写了之后,系统默认的就会消失(这一点,就是构造函数)

拷贝构造函数可以实现:对象的复制

class Monster
{
public:
 
	Monster(Monster& m)		//拷贝构造函数(默认形态)
	{
		//默认的拷贝构造函数(默认形态),将对象一一对应给值
		cout << "默认的拷贝构造函数(默认形态) " << endl;
		this->hp = m.hp;
	}
	Monster(int hp);		//构造函数
	~Monster();				//析构函数
	void show();
private:
	int hp;
};
int main()
{
	Monster monster1(100);
	monster1.show();
	Monster monster3 = monster1;//使用monster1给monster3初始化
	monster3.show();
	Monster monster4(monster1);//使用monster1去构造monster4
	monster4.show();
	return 0;
}
Monster::Monster(int hp)
{
	cout << "调用了带参构造函数" << endl;
http://www.cppcns.com	this->hp = hp;
}
Monster::~Monster()
{
	cout << "调用了析构函数" << endl;
}
void Monster::shwww.cppcns.comow()
{
	cout << "调用了显示函数" << endl;
	cout<<this->hp << "" << endl;
 
}

二、调用时机

一、函数的参数是:“类的对象”

二、函数的返回值是类的对象

三、使用一的对象给另一个对象初始化

四、使用一个对象构造另一个对象

注意

赋值不属于拷贝构造,所以不调用拷贝构造函数

浅拷贝和深拷贝

浅拷贝就是默认的拷贝构造函数,这个拷贝构造的操作,我们可以理解为,是用‘=’号一个一个的赋值的,我们将之称为,浅拷贝,因为在用指针的时候就可以能会出现问,因为我们知道两个同等类型的指针之间用‘=’号赋值,是两个指针的地址指向同一个内存,那么就可能会存在一个问题,就是两个对象的指针都指向同一个内存,那么如果其中一个对象把该内存释放了,就会导致另外一个对象的指针变成野指针。 

为此,我们就需要进行到深拷贝

public:
	int *p;
	Rect();
	~Rect();
	int width;//宽
	int height;//高
	//重载拷贝构造,实现浅拷贝拷贝
	Rect(Rect&rect)
	{
		
		this->height = rect.height;
		this->width = rect.width;
		this->p=rect.p;
	}
public:
	int *p;
	Rect();
	~Rect();
	int width;//宽
	int height;//高
	//重载拷贝构造,实现深拷贝
	Rect(Rect&rect)
	{
		
		this->height = rect.height;
		this->width 编程客栈= rect.width;
		this->p = new int;//重新申请内存
		*p = *rect.p;//拷贝之前的值
	}

可见,浅拷贝与深拷贝的www.cppcns.com差距就是前者是直接拷贝指针,让两个指针同时指向一个地址,这样一方进行析构的时候,另一方就会成为野指针,而深拷贝就是避免了这一点,申请一块新内存,并复制这块内存的数据。

总结

到此这篇关于c++特殊构造函数详解的文章就介绍到这了,更多相关c++特殊构造函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消