C++-拷贝构造函数

news/2024/7/7 20:23:07

深拷贝与浅拷贝

浅拷贝:类中的缺省拷贝构造函数,对指针形式的成员变量按字节复制,而不会复制指针所指向的内容,这种拷贝方式称为浅拷贝。

#include <iostream>
using namespace std;

class Integer{
private:
	int m_i;

public:
	Integer(int i = 0) {
		m_i = i;
	}

	void printf(void) {
		cout << m_i << endl;
	}
};
int main(int argc, const char *argv[])
{
	Integer a = 100;
	Integer b = a;//实际是将b的地址指向a的地址
	b.printf();
	Integer c(a);//类似与b
	c.printf();
	
	return 0;
}

深拷贝:为了避免浅拷贝遇到的重复重置内存问题,获得完整意义上的对象副本,必须自己定义拷贝构造函数,针对指针的成员变量,实现对指针指向内容的复制。

#include <iostream>
using namespace std;

class Integer{
private:
	int *m_i;

public:
	Integer(int i = 0) {
		m_i = new int(i);
	}

	void printf(void) {
		cout << *m_i << endl;
	}

	~Integer(void) {
		delete m_i;
	}

	Integer(const Integer &that) {
		m_i = new int(*that.m_i);
	}
};
int main(int argc, const char *argv[])
{
	Integer a = 100;
	Integer b = a;//实际是将b的地址指向a的地址
	b.printf();
	Integer c(a);//类似与b
	c.printf();
	
	return 0;
}

拷贝赋值

当两个对象进行赋值操作时,比如“i3 = i2”编译器会讲其处理为“i3.operator = (i2)的成员函数调用形式”,其中“operator=”称为拷贝赋值操作符函数,由该函数完成其赋值运算,其返回结果就是表达式的结果。

如果没有自定义拷贝赋值操作符函数,编译器会为该类提供缺省的拷贝赋值操作符函数,用于完成两个对象的赋值操作。

但是编译器提供的缺省拷贝赋值函数,和缺省拷贝构造函数类似,也是浅拷贝,有“double free”和“内存泄露”的问题,这时需要自定义深拷贝赋值函数。

拷贝赋值符函数格式为:

Integer &operation = (const Integer &that){

}

/*
Integer:类名称
&operation= :固定写法
that:指针
*/
#include <iostream>
using namespace std;

class A{
private:
	int *m_pi;

public:
	A(int i = 0) {
		m_pi = new int(i);
	}

	void printf(void) {
		cout << *m_pi << endl;
	}

	~A(void) {
		cout << "~A" <<endl;
		delete m_pi;
	}

	A(const A &that) {
		m_pi = new int(*that.m_pi);
	}
};
int main(int argc, const char *argv[])
{
	A a = 100;
	a.printf();
	A b = a;
	b.printf();

	b = a;
	
	return 0;
}
/*运行结果报错
linux@linux:~/cplusplus$ ./a.out 
100
100
~A
~A
*** Error in `./a.out': double free or corruption (fasttop): 0x09a57008 ***
Aborted (core dumped)
*/

String类的编程实现

实现一个字符串String,为其提供可接受c风格字符串的构造函数、析构函数、拷贝构造函数和拷贝赋值函数。

#include <iostream>
#include <cstring>
using namespace std;

class String{
private:
	char *str;

public:
	String(const char *str) {//类型转换构造函数
		this->str = new char(strlen(str) +1);
		strcpy(this->str,str);

	}
	
	String(const String &that) {//拷贝构造函数
		str = new char[strlen(that.str) +1];
		strcpy(str, that.str);
	}

	String &operator=(const String &that) {//拷贝赋值
		if (this != &that) {
			delete []str;//删除原本的地址
			str = new char[strlen(that.str) +1];//申请新地址
			strcpy(str, that.str);//拷贝内容到新地址中
		}
		return *this;
	}


	~String(void) {
		delete str;
	}
	void print(void) {
		cout << str << endl;
	}

	char *c_str(void) {
		return str;
	}
};
int main(int argc, const char *argv[])
{
	String s1 = "hello";//类型转换构造函数
	s1.print();

	String s2 = s1;//拷贝构造函数
	s2.print();

	String s3 = "world";//类型转换构造函数
	s2 = s3;//拷贝赋值
	s2.print();

	cout << s3.c_str() << endl;
	return 0;
}


http://lihuaxi.xjx100.cn/news/1952741.html

相关文章

走进shell

Linux系统启动时&#xff0c;会自动创建多个虚拟控制台。虚拟控制台是运行在Linux系统内存中的终端会话。 打开Linux控制台Terminal使用tty命令查看当前使用的虚拟控制台。 注&#xff1a;tty 表示电传打字机(teletypewriter) $ tty /dev/pts/0表示当前使用的是/dev/pts/0 虚拟…

vue使用sm2对手机号邮箱等加签名,数据完整性

vue使用sm2对手机号邮箱等加签名&#xff0c;数据完整性 1、安装依赖 npm install --save sm-crypto2、在utils文件下新建sm2Util.js // sm2Util.js const SM2 require(sm-crypto).sm2; const publicKey woshigongyao // 公钥 const privateKey woshisiyao // 私钥/* * 加…

66.网游逆向分析与插件开发-角色数据的获取-角色类的数据分析与C++还原

内容来源于&#xff1a;易道云信息技术研究院VIP课 ReClass.NET工具下载&#xff0c;它下方链接里的 逆向工具.zip 里的reclass目录下&#xff1a;注意它分x64、x32版本&#xff0c;启动是用管理员权限启动否则附加时有些进程附加不上 链接&#xff1a;https://pan.baidu.com/…

65、python - 利用手写的网络,成功预测一张图片

上面两节通过介绍了几种预处理方法,分别是 Resize and Crop 和 Normalization。在完成图像预处理之后,加上之前手动搭建的神经网络,其实我们就可以对图形进行推理识别了。 这一节我们使用自己手写的算法、自己搭建的神经网络,来第一次完成一张图像的识别。 下面对一些重要…

Springboot的配置文件详解:从入门到精通,解读配置文件的奇妙世界

目录 1、前言 2、介绍 2.1 Springboot配置文件的作用 2.2 Springboot支持的配置文件类型 2.3 Springboot配置文件的加载顺序 3、YAML配置文件 3.1 YAML基本语法介绍 3.2 YAML中的基本数据类型 3.3 YAML中的复合数据类型 3.4 YAML中的配置属性 3.5 YAML中的多环境配置…

网络协议与攻击模拟_03实施ARP欺骗和攻击

一、ARP攻击 1、实验环境 kali Linux &#xff08;安装arpspoof工具&#xff09;被攻击主机 2、kali配置 kali Linux系统是基于debian Linux系统&#xff0c;采用deb包管理方式&#xff0c;可以使用apt源的方式进行直接从源的安装。 配置kali网络源 vim /etc/apt/sources…

go 的内存布局和分配原理

go 之所以在高并发环境下表现优异&#xff0c;除了咱们都知道的 GMP 模型&#xff0c;其实 go 的内存布局和分配机制也起到了不少作用。 1. 分配内存三大组件 go 分配内存的过程&#xff0c;主要由三大组件所管理&#xff0c;级别从上到下分别是&#xff1a; mheap go 在程…

【SEO优化】之html语义化标签

ChatGPT4.0国内站点&#xff1a;海鲸AI HTML语义化标签是指那些具有明确含义或者能够清晰描述其代表内容或功能的标签。使用语义化标签不仅能够使网页的结构更加清晰&#xff0c;而且有助于搜索引擎优化&#xff08;SEO&#xff09;&#xff0c;并且提升网站的可访问性&#xf…