C++ 拷贝构造函数与赋值的区别

 更新时间:2024年04月29日 08:32:38   作者:啊QQQQQ  
拷贝构造函数和赋值函数非常容易混淆,本文主要介绍了C++ 拷贝构造函数与赋值的区别,具有一定的参考价值,感兴趣的可以了解一下

拷贝构造函数

拷贝构造函数的也是一种构造函数,它的作用是将一个类的成员拷贝到另一个类中,类似于赋值。拷贝构造函数分为深拷贝和浅拷贝。

先来定义一个拷贝构造函数(构造函数可以重载),看招:

#include<iostream>
using namespace std;
class date
{
public:
	date(int year=0, int month=0, int day=0)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	date(const date& d)//拷贝构造函数
	{
		this->_year = d._year;
		this->_month = d._month;
		this->_day = d._day;
	}
	void print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

 将一个类拷贝到另一个类中,自然是需要对应的参数的,参数就是类,这里可以传递指针,引用更好,只是传值形参的话,会造成无限递归。

拷贝构造函数的使用方法

拷贝构造函数的使用:
1.使用();2.使用'=';像这样

拷贝构造函数与赋值运算符的区别

那么拷贝构造函数和赋值运算符有什么区别呢,先来看一段代码对比一下:

int main()
{
	date d1(20244, 4, 24);
	date d2=d1;
	date d3;
	d3= d1;//编译器会自动将其转化为d3(d1);
	return 0;
}

这里d2采用的拷贝构造函数的方式,d3采用赋值的方式,通过观察,我们可以发现,前者是创造变量时就对类进行了赋值,这个赋值叫做初始化,而后者是先定义好的类,后续赋值,在赋值之前是已经将变量创建好的;

谈深拷贝和浅拷贝

先说浅拷贝

浅拷贝

浅拷贝就是对成员变量进行一一对应赋值,来看一个代码:

#include<iostream>
using namespace std;
class date
{
public:
	date(int a=1,int b=1)
	{
		_a = a;
		_b = b;
	}
	date(const date& d)
	{
		_a = d._a;//成员变量简单的赋值
		_b = d._b;
	}
	void print()
	{
		cout << _a << ',' << _b << endl;
	}
	~date()
	{
		cout << "~date" << endl;
	}
private:
	int _a;
	int _b;
};


int main()
{
	date d1(2,5);
	date d2(d1);
	d2.print();
	return 0;
}

 在这个代码中,在对d2进行初始化的时候,是将d1的成员变量对d进行了赋值;最后代码结束存在两次析构,分别是d2和d1的;

注意:

对于简单的成员变量进行简单的复制操作并无大碍,但是如果是指针类型的变量就会出现问题;看代码;

#include<iostream>
using namespace std;
class date
{
public:
	date(int b=1)
	{
		_a =new int[4];
		_b = b;
	}
	date(const date& d)
	{
		_a = d._a;
		_b = d._b;
	}
	void print()
	{
		cout << _a << ',' << _b << endl;
	}
	~date()
	{
		free(_a);//拷贝后两个成员变量都指向同一块空间,会造成多次析构
		cout << "~date" << endl;
	}
private:
	int* _a;
	int _b;
};


int main()
{
	date d1(5);
	date d2(d1);
	d2.print();
	return 0;
}

代码中_a为指针类型,初始化是对其进行开辟空间;代码结束对类进行析构,但是问题来了,浅拷贝只是简单的赋值,针对_a来说,d1和d2的_a都指向同一片空间,这就造成了在代码结束时,这片空间会释放两次,就会发生错误,对此就需要进行深拷贝来解决。 

深拷贝

#include<iostream>
using namespace std;
class date
{
public:
	date(int b=1)
	{
		_a =new int[4];
		_a[0] = 10;
		_b = b;
	}
	date(const date& d)
	{
		_a = new int[4];
		memcpy(_a, d._a, sizeof(int) * 4);//将d2的数据拷贝过来
		_b = d._b;
	}
	void print()
	{
		cout << _a[0] << ',' << _b << endl;
	}
	~date()
	{
		free(_a);
		cout << "~date" << endl;
	}
private:
	int* _a;
	int _b;
};


int main()
{
	date d1(5);
	date d2(d1);
	d2.print();
	return 0;
}

在拷贝构造的时候对本类的_a也进行开辟空间,然后把另一类的数据利用memcpy拷贝过来就OK了。 这样就不会出现析构多次同一片空间的问题。

到此这篇关于C++ 拷贝构造函数与赋值的区别的文章就介绍到这了,更多相关C++ 拷贝构造函数与赋值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++轻量级界面开发框架ImGUI介绍小结

    C++轻量级界面开发框架ImGUI介绍小结

    如果从事过C++ Windows客户端开发,大家对MFC、Qt、DuiLib等各种DirectUI应该有了解,本篇给大家介绍一个超级轻量级的C++开源跨平台图形界面框架ImGUI,感兴趣的可以了解一下
    2021-11-11
  • 200行C语言代码实现简易三子棋游戏

    200行C语言代码实现简易三子棋游戏

    三子棋(井字棋)我们的童年或多或少都体验过这个游戏的乐趣,本子随手一画就是一局游戏的开始,下面这篇文章主要给大家介绍了关于200行C语言代码实现简易三子棋游戏的相关资料,需要的朋友可以参考下
    2023-05-05
  • C++对Json数据的友好处理实现过程

    C++对Json数据的友好处理实现过程

    在Ajax的应用中,前台基本上会用到JSON作为数据交换格式,所以下面这篇文章主要给大家介绍了关于C++对Json数据的友好处理,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • C语言学生信息管理系统小项目

    C语言学生信息管理系统小项目

    这篇文章主要为大家详细介绍了C语言学生信息管理系统小项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++作用域与函数重载的实现

    C++作用域与函数重载的实现

    本文主要介绍了C++作用域与函数重载的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C++实现基于reactor的百万级并发服务器

    C++实现基于reactor的百万级并发服务器

    本文介绍了基于Reactor模式的百万级并发服务器,使用epoll进行高效I/O多路复用,支持多个端口的监听,并通过回调机制处理每个连接的接收和发送操作,需要的朋友可以参考下
    2025-02-02
  • Matlab控制电脑摄像实现实时人脸检测和识别详解

    Matlab控制电脑摄像实现实时人脸检测和识别详解

    人脸识别过程主要由四个阶段组成:人脸检测、图像预处理、面部特征提取和特征识别。这篇文章主要介绍了如何使用MATLAB控制笔记本电脑的摄像头,并进行实时人脸检测和识别,需要的可以参考一下
    2022-10-10
  • C语言数据结构树之后序遍历的实现

    C语言数据结构树之后序遍历的实现

    这篇文章主要介绍了C语言数据结构之后序遍历的实现的相关资料,这里提供一个简单实例来实现后续遍历,对于数据结构树的学习很有帮助,需要的朋友可以参考下
    2017-07-07
  • C++实现Window环境聊天室功能

    C++实现Window环境聊天室功能

    这篇文章主要为大家详细介绍了C++实现Window环境聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C++ STL实现非变易查找算法的示例代码

    C++ STL实现非变易查找算法的示例代码

    C++ STL 中的非变易算法(Non-modifying Algorithms)是指那些不会修改容器内容的算法,是C++提供的一组模板函数,下面我们就来看看这一算法的应用吧
    2023-08-08

最新评论