C++核心编程和桌面应用开发 第七天(运算符重载 智能指针)

news2024/9/27 7:20:14

目录

1.数组类

2.运算符重载

2.1加号运算符

2.1.1成员函数实现

2.1.2全局函数实现

2.1.3加号重载

2.2左移运算符

2.3递增运算符

2.4指针运算符

2.5赋值运算符


1.数组类

//默认构造函数
MyArray::MyArray()
{
	m_Size = 0;
	m_Capacity = 100;
	pAddress = new int[m_Capacity];
}

//析构函数
MyArray::~MyArray()
{
	if (nullptr != pAddress)
	{
		delete[] pAddress;
		pAddress = nullptr;
	}

}

//有参构造
MyArray::MyArray(int capacity)
{
	m_Size = 0;
	m_Capacity = capacity;
	pAddress = new int[m_Capacity];
}

//拷贝构造
MyArray::MyArray(const MyArray& arr)
{
	m_Size = arr.m_Size;
	m_Capacity = arr.m_Capacity;
	pAddress = new int[arr.m_Capacity];

	for (int i = 0; i < arr.m_Size; i++)
	{
		pAddress[i] = arr.pAddress[i];
	}
}

//根据位置设置数据
void MyArray::setData(int pos, int data)
{
	pAddress[pos] = data;
}

//获取数据
int MyArray::getData(int pos)
{
	return pAddress[pos];
}

//尾插
void MyArray::pushBack(int data)
{
	if (m_Size > m_Capacity)
	{
		return;
	}
	pAddress[m_Size] = data;
	m_Size++;
}

//获取容量
int MyArray::getCapacity()
{
	return m_Capacity;
}

//获取大小
int MyArray::getSize()
{
	return m_Size;
}

2.运算符重载

给运算符新的含义,可以实现不同数据类型的运算。

  • 运算符需要两个参数时,局部实现只传一个参数,全局实现传两个参数;
  • 运算符需要一个参数时,局部实现不传参数,全局实现传一个参数。

2.1加号运算符

例如,此时p1+p2编译器不知道如何运算,需要我们自定义

2.1.1成员函数实现

 

2.1.2全局函数实现

2.1.3加号重载

只要将函数名改成operator+即可。

2.2左移运算符

cout << 10;
cout << p1;

输出一个自定义对象时,编译器懵了,此时需要重载左移运算符。

ostream& operator<<(ostream& cout, Person& p)
{
	cout << p.m_A << p.m_B;
	return cout;
}

cout返回的还是cout对象,因此,返回值类型是ostream&。

2.3递增运算符

//前置递增
cout << ++myInter;

后置递增
cout << myInter++;

对一个对象进行自增操作,编译器懵了,此时需要重载递增运算符。

//前置递增
MyInter& operator++()
{
	m_Num++;
	return *this;
}

//后置递增
int operator++(int)
{
    int temp=m_Num;
	m_Num++;
	return temp;
}
  • 前置递增返回值的类型是引用后置递增返回值的类型是int
  • 后置递增添加一个int做占位参数,来区分前置和后置。

2.4指针运算符

//sp释放时,会自动释放Person
smartPoint sp(new Person(18));

智能指针smartPoint本质上是一个类,可以托管new出的对象,使其自动释放。

但此时,sp本质是个对象,无法像指针一样操作Person的成员,所以需要重载“->”和“*”。

Person* m_Person;

Person* operator->()
{
	return m_Person;
}

Person& operator*()
{
	return *m_Person;
}

2.5赋值运算符

有属性指向堆区,并用到赋值运算时,需要重载赋值运算。因为默认的赋值行为是值拷贝的。

class Person
{
public:
	Person(char* name, int age)
	{
		m_Name = new char[strlen(name) + 1];
		strcpy(m_Name, name);
		m_Age = age;
	}

    //赋值运算符的重载
	Person& operator=(const Person& p)
	{
		m_Age = p.m_Age;

		if (nullptr != m_Name)
		{
			delete m_Name;
			m_Name = nullptr;
		}
		m_Name = new char[strlen(p.m_Name) + 1];
		strcpy(m_Name, p.m_Name);
	}

	char* m_Name;
	int m_Age;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【有啥问啥】深度解析迁移学习(Transfer Learning)

深度解析迁移学习&#xff08;Transfer Learning&#xff09; 在机器学习领域&#xff0c;迁移学习&#xff08;Transfer Learning&#xff09;作为一种强大的技术&#xff0c;正广泛应用于各种实际场景中。本文将详细解析迁移学习的基本概念、原理、分类、应用场景以及具体实…

vue3中storeToRefs让store中的结构出来的数据也能变成响应式

1、首先需要安装pinia 具体安装和使用教程参考 2、创建 src/stores/counter.js 文件&#xff0c;其内容如下&#xff1a; import {defineStore} from "pinia"; import {ref} from "vue";export const useCounterStore defineStore(counter,()>{const…

C语言程序设计题目十九:编写一万年历系统

文章目录 题目十九&#xff1a;编写一万年历系统calendar.hcalendar.ctest.c 题目十九&#xff1a;编写一万年历系统 要求&#xff1a; 模仿现实中的挂历&#xff0c;显示当前月的每一天及星期几&#xff0c;当系统日期变为下一个月时&#xff0c;自动翻页到下一个月。 calend…

【第3期】INFINI Easysearch 免费认证培训开放报名

探索 Easysearch 的无限可能&#xff0c;与 INFINI Labs 共赴搜索技术前沿&#xff01; 随着数字化转型的加速&#xff0c;搜索技术已成为企业数据洞察的核心。INFINI Labs 作为搜索创新技术的引领者&#xff0c;诚邀所有对 Easysearch 搜索引擎感兴趣的开发者、技术爱好者及合…

安卓13禁止待机 永不休眠 android13永不休眠

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 设置 =》显示 =》屏幕超时 =》 永不。 我们通过修改系统待机时间配置,来达到设置屏幕超时的配置。像网上好多文章都只写了在哪里改,改什么东西,但是实际上并未写明为什么要改那…

[智能控制】【第2 章 模糊控制的理论基础】

目录 第2章 模糊控制的理论基础 2.1 概述——模糊控制的提出 2.1 概述——模糊控制的特点 2.2 模糊集合 2.2.1 模糊集合 1 特征函数和隶属函数 2 模糊集合的表示 例2.1 例2.2 2.2.2 模糊集合的运算 1 模糊集合的基本运算 &#xff08;1&#xff09;空集…

docker搭建clickhouse并初始化用户名密码

1、新建挂载目录 mkdir -p /home/clickhouse-server/ mkdir -p /home/clickhouse-server/etc/2、拉取镜像 docker pull clickhouse/clickhouse-server3、创建临时容器 docker run -d --rm --name clickhouse-server --ulimit nofile262144:262144 clickhouse/clickhouse-ser…

目标检测流程

流程概述 背景&#xff1a;梳理目标检测标注&#xff0c;训练&#xff0c;部署全流程。供后续初学者快速上手 方案&#xff1a;Ubuntu&#xff08;PC端&#xff09;进行标注&#xff0c;基于OpenMMLab进行训练得到pt模型&#xff0c;pt模型通过转换rknn并部署。 1. 数据集 公…

成都睿明智科技有限公司可靠吗?

在这个短视频风靡的时代&#xff0c;抖音已不仅仅是一个娱乐平台&#xff0c;它更是无数商家眼中的蓝海市场&#xff0c;是电商领域的新宠儿。在这场流量与转化的盛宴中&#xff0c;成都睿明智科技有限公司以其敏锐的市场洞察力和专业的服务能力&#xff0c;正逐步成为抖音电商…

使用three.js 实现着色器草地的效果

使用three.js 实现着色器草地的效果 在线预览https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationThreeJS&classifyshader&idgrassShader 在 https://threehub.cn 中还有很多案例 import * as THREE from three import { OrbitControls…

Java基础(Arrays工具类)(asList()方法)(详细)

目录 一、Arrays工具类 &#xff08;1&#xff09;引言 &#xff08;2&#xff09;基本介绍 &#xff08;3&#xff09;主要功能&#xff08;提供的方法&#xff09; &#xff08;I&#xff09;排序&#xff08;Arrays.sort()&#xff09; &#xff08;II&#xff09;搜索(查找…

IDEA自动清理类中未使用的import包

目录 1.建议清理包的理由 2.清理未使用包的方式 2.1 手动快捷键清理 2.2 设置自动清理 1.建议清理包的理由 有时候项目类文件中会有很多包被引入了&#xff0c;但是并没有被使用&#xff0c;这会增加项目的编译时间并且代码可读性也会变差。在开发过程中&#xff0c;建议设…

ISP去噪(3)_图像的高频分量和低频分量

#图像分析# 总是不好确认头发和毛绒玩具到底是低频还是高频分量。现在得出结论&#xff0c;头发和毛绒玩具都是高频信息&#xff0c;因为细节很多。 目录 图像的频率 (1) 什么是低频? (2) 什么是高频? &#xff08;3&#xff09;低频和高频对比 &#xff08;4&#xf…

谷歌今天发布了两款升级版Gemini模型:Gemini-1.5-Pro-002和Gemini-1.5-Flash-002

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

免杀笔记 ---> 无痕Hook?硬件断点 Syscall!

说到Hook&#xff0c;我们有很多Hook&#xff0c;像Inline-Hook&#xff0c;我们也是用的比较多&#xff0c;但是正如我上一篇Blog说的&#xff0c;他会对内存进行修改&#xff0c;如果EDR或者AV增加一个校验机制&#xff0c;不断检验某一块内存&#xff0c;那么就算你用syscal…

Flink 结合kafka 实现端到端的一致性原理

Kafka 事务实现原理 Flink checkpoint 结合kafka 实现端到端的一致性 为啥taskState 的时候要开启一个新事务&#xff0c;因为本来做state 就相当于把barrier之前的状态做一个快照&#xff0c;相当于是一个新的开始&#xff0c;所以开启一个新的事务。那为啥checkpoint 第一步要…

如何在数据分析中处理异常?

在数据分析中&#xff0c;处理异常值是确保数据质量的关键步骤。以下是一些常见的方法&#xff1a; 1. 检测异常值 可视化方法 箱线图&#xff1a;通过matplotlib或seaborn绘制箱线图&#xff0c;识别数据中的异常值。 import seaborn as sns import matplotlib.pyplot as …

新版双向链表,添加了at, front, back, insert, emplace等为了兼容std.

例子&#xff1a; #define _list _DListint main() {list<int> c1 { 1,2,3,4,5,6,7,8,9,10};if (!c1.empty()) {c1.front() 42; //将42赋予c中的一个元素auto& v c1.back(); //获得指向最后一个元素的引用v 1024; //改变c中的元素auto v2 c1.back(); //v2不…

【笔记】Dynamic Taint Analysis 动态污点分析

Dynamic Taint Analysis 动态污点分析 什么是动态污点分析&#xff1f;为什么要搞动态污点分析&#xff1f; “污点”指的是什么&#xff1f; DTA中的“污点”指代的是不可信的输入&#xff0c;比如用户输入、网络请求、文件数据等。比方说&#xff0c;如果把程序看作一个城市&…

知识图谱检索 Graph-Based Retriever:文本块到结构化数据的转换,解决语义检索捕获不了的长尾关系

知识图谱检索 Graph-Based Retriever&#xff1a;文本块到结构化数据的转换&#xff0c;解决语义检索捕获不了的长尾关系 如何理解&#xff1f;如何分析&#xff1f;升维降维梳理为什么这种解法能查到长尾内容&#xff0c;而传统语义不行&#xff1f;解法拆解 如何关联&#xf…