C++回顾(十三)—— 运算符重载提高

news2024/9/25 11:20:18

13.1 为什么不要重载 && 和 || 运算符

  • 1)&&和||是C++中非常特殊的操作符
  • 2)&&和||内置实现了短路规则
  • 3)操作符重载是靠函数重载来完成的
  • 4)操作数作为函数参数传递
  • 5)C++的函数参数都会被求值,无法实现短路规则

短路原则:
在这里插入图片描述
重载 && 代码示例:

#include <iostream>

using namespace std;

int f1()
{
	cout << "this is f1" << endl;
	return 0;
}

int f2()
{
	cout << "this is f2" << endl;
	return 1;
}

class Complex
{
private:
	int a;
	int b;
public:
	Complex(int a, int b)
	{
		this->a = a;
		this->b = b;
	}
	Complex operator+(const Complex &c)
	{
		cout << "operator+" << endl;
		Complex t(0, 0);
		t.a = this->a + c.a;
		t.b = this->b + c.b;

		return t;
	}
	bool operator&&(const Complex &c)
	{
		return (this->a && c.a) && (this->b && c.b);
	}
};

int main()
{
	if (f1() && f2())   //短路原则:如果f1()不成立,则不会执行f2()
	{
		cout << "helloworld" << endl;
	}

	Complex c1(1, 1);
	Complex c2(2, 2);
	Complex c3(0, 0);

	if (c1 && c2)
	{
		cout << "成立" << endl;
	}

	if (c1 && c3)
	{
		cout << "成立" << endl;
	}


	//c3.operator&&(c1 + c2)   c3.operator&&(c1.operator+(c2))
	if (c3 && (c1 + c2))    //重载逻辑&&违背了短路原则  所以不要重载逻辑&& ||
	{
		
	}

	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

13.2 数组类相关运算符的重载

13.2.3 重载数组下标运算符[ ]

  • 运算符 [ ] 都只能通过成员函数重载
    在这里插入图片描述

13.2.2 重载赋值运算符 =

  • 所有的类都默认重载了 = 运算符,但是只是简单的赋值(浅拷贝),对于数组类而言,只能用深拷贝。
  • 而如果在类外边通过友元函数进行重载 = 的话,系统会自动调用默认的重载函数,出现浅拷贝的问题,也就是一个内存空间被两次释放。所以 = 运算符的重载只能在类内通过成员函数进行

步骤:
1 先释放旧的内存
2 返回一个引用
3 =操作符 从右向左

在这里插入图片描述

其中,在赋值前要判断是否出现自己给自己赋值的情况(如果出现这种情况没有直接返回,在下面delete后,就不能进行访问了)。也重载了一下 == 运算符。
在这里插入图片描述
完整示例代码:

#include <iostream>

using namespace std;

class Array
{
private:
	int *data;
	int size;

public:
	Array(int s)
	{
		size = s;
		data = new int[size];
	}

	int &operator[](int Index)
	{
		return data[Index];
	}

	bool operator==(const Array &a)
	{
		if (this->size != a.size)
		{
			return false;
		}

		for (int i = 0; i < size; i++)
		{
			if (this->data[i] != a.data[i])
			{
				return false;
			}
		}

		return true;
	}

	Array &operator=(const Array &a) // 赋值运算符只能重载成成员函数
	{
		if (*this == a)
		{
			return *this;
		}

		this->size = a.size;
		delete this->data;
		this->data = new int[size];
		for (int i = 0; i < size; i++)
		{
			this->data[i] = a.data[i];
		}
		return *this;
	}

	~Array()
	{
		if (data != NULL)
		{
			delete[] data;
		}
	}
};

int main()
{
	Array a1(10); // 创建数组对象

	for (int i = 0; i < 10; i++)
	{
		a1[i] = i + 10; // a1.operator[](i) = i + 10
	}

	for (int i = 0; i < 10; i++)
	{
		cout << a1[i] << " ";
	}
	cout << endl;

	Array a2(5);

	// a1 = a2;   //所有类都默认重载了=运算符,但是只是简单的赋值(浅拷贝)
	a1 = a1;
	for (int i = 0; i < 10; i++)
	{
		cout << a1[i] << " ";
	}
	cout << endl;

	return 0;
}

运行结果:
在这里插入图片描述

13.3 智能指针类auto_ptr

在这里插入图片描述
好像可以自己释放内存,不用自己去调用delete(不过这个智能指针已经被遗弃了)

完整示例代码:

#include <iostream>
#include <memory>

using namespace std;

class Test
{
public:
	Test()
	{
		cout << "Test构造函数" << endl;
	}
	void print()
	{	
		cout << "xxx" << endl;
	}
	~Test()
	{
		cout << "Test析构函数" << endl;
	}
};

void f1()
{
	Test *pt = new Test;    //内存泄漏
}

void f2()
{
	auto_ptr<Test> my_memory(new Test);

	my_memory->print();   // 等价于my_mempry.operator->(print())
}

int main()
{
	//f1();
	f2();

	return 0;
}

运行结果:
在这里插入图片描述

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

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

相关文章

xxl-job分布式任务调度平台

分布式任务调度平台XXL-JOB (xuxueli.com) 1 xxl-job概述 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 1.1 xxl-job架构 我把上面的图精简了一下&#xff0c;xxl-job 的调度器和业务执行是独立的。调度器决定任务的调…

【数据分析师求职面试指南】必备基础知识整理

数据分析师基础知识统计 数据分析知识基础概念随机变量常用特征正态分布与大数定律、中心极限定律假设检验模型、数据挖掘知识常用概念数据集划分欠拟合过拟合模型分类方法常见模型介绍线性回归模型&#xff1a;逻辑回归模型决策树模型随机森林模型Boosting模型XGBoost模型模型…

前后端分离项目学习-vue+springboot 博客

前后端分离项目 文章总体分为2大部分&#xff0c;Java后端接口和vue前端页面 项目演示&#xff1a;www.markerhub.com:8084/blogs Java后端接口开发 1、前言 从零开始搭建一个项目骨架&#xff0c;最好选择合适&#xff0c;熟悉的技术&#xff0c;并且在未来易拓展&#xf…

精简:设计模式

1.设计模式概述 1.什么是设计模式 设计模式(Design Pattern)是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。 它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 1995年&#xff0c;GoF (Ga…

flutter工程创建过程中遇到一些问题。

安装环境版本&#xff1a;JDK7.-JDK 8 Andriod SDK 10 flutter 版本 3.0 1.当创建完后flutter工程后会遇到 run gradle task assemlble Debug 的问题&#xff0c;需要设置远程仓库&#xff0c;共需要修改三个地方build.gradle两处以及flutter 下面的D:\FVM\versions\3.0.0\pac…

Excel常用可视化图表

目录柱状图与条形图折线图饼图漏斗图雷达图瀑布图及甘特图旭日图组合图excel图表&#xff1a;柱状数据条、excel热力图、mini图可视化工具的表现形式&#xff1a;看板、可视化大屏、驾驶舱 柱状图与条形图 条形图是柱状图的转置 类别&#xff1a; 单一柱状图&#xff1a;反映…

Linux内核移植

内核移植半导体厂商会从linux内核官网下载某个版本&#xff0c;将其移植到自己的CPU上&#xff0c;测试成功后就会将其开放给该半导体的厂商的CPU开发者&#xff0c;开发者下载其提供的linux内核&#xff0c;然后将其移植到自己的 产品上。1、NXP官方开发板Linux内核编译测试编…

VR会议不断升级,为商务会谈打造云端洽谈服务!

VR会议不断升级&#xff0c;为商务会谈打造云端洽谈服务。在商务合作中&#xff0c;对客户需求的理解以及与客户讲解方案都需要建立在一个有效的沟通上&#xff0c;因此VR会议的用武之地就有了&#xff0c;以VR全景技术为核心&#xff0c;通过同屏互动和全景通信技术&#xff0…

wiki(维基)是什么?企业为什么需要搭建wiki?

维基百科是wiki的一个著名例子。维基百科上的内容可以由任何人创建和编辑&#xff0c;只要他们能够访问网络浏览器&#xff0c;并且可以使用简化的加价语言进行写作。对于 wiki&#xff0c;没有集中的作者或团队负责内容生成。从某种意义上说&#xff0c;维基是非常民主的。维基…

【SCL】移位和循环指令的应用(音乐喷泉改进)

移位指令&#xff1a;右移&#xff08;SHR&#xff09;左移&#xff08;SHL&#xff09;和循环左移/右移&#xff08;ROR/ROL&#xff09;指令的应用 文章目录 目录 一、移位和循环移位指令 1.左移右移 2.使用左移和脉冲实现音乐喷泉 3.循环移位指令 二、优化的其它方法 1.使用…

计算机SCI期刊的分值是什么意思? - 易智编译EaseEditing

影响因子&#xff08;Impact Factor,IF)是美国ISI&#xff08;科学信息研究所)的JCR(期刊引证报告)中的一项数据。 即某期刊前两年发表的论文在统计当年的被引用总次数除以该期刊在前两年内发表的论文总数。这是一个国际上通行的期刊评价指标。 例如&#xff0c;某期刊2005年影…

2023年主流的固定资产管理方式

2023年主流的固定资产管理方式可能有以下三种&#xff1a; 基于PaaS平台的固定资产管理系统&#xff0c;支持低代码平台&#xff0c;可以通过拖拉拽的方式进行表单搭建、流程搭建、自定义仪表盘等&#xff0c;满足不同行业和企业的个性化需求。基于RFID和二维码相结合的固定资…

卷麻了,00后Jmeter用的比我还熟练,简直没脸见人......

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对测试工具的使用感到困扰&#xff1f;前言性能测试是一个全栈工程师/架构师必会的技能之一&#xff0c;只有学会性能测试&#xff0c;才能根据得到的测试报告进行分析&#xff0c;找到系统性…

Allegro如何快速查看差分对是否等长的方法

在用Allegro进行PCB设计时&#xff0c;用快速查看差分对是否等长的方法&#xff0c;可以提高效率。那如何操作呢&#xff1f;具体操作方法如下&#xff1a;&#xff08;1&#xff09;选择菜单栏Route选择Timing Vision&#xff08;时序视图&#xff09; 然后在Options选项卡Tim…

陀螺和加计有关参数部分说明

部分参数计算一、零偏二、随机游走三、Allan方差分析使用要点一、零偏 如果只用一个指标来代表一款IMU的精度的话&#xff0c;那毫无疑问是陀螺零偏。这是因为&#xff1a;1) 惯导系统的精度主要取决于IMU中的陀螺器件精度&#xff0c;而不是加速度计精度&#xff1b;2) 陀螺的…

黑客入门教程【非常详细】从零基础入门到精通,看这一篇就够了!

首先要明白啊&#xff0c;我们现在说的黑客不是那种窃取别人信息、攻击别人系统的黑客&#xff0c;说的是调试和分析计算机安全系统的网络安全工程师。 黑客技术的核心就是渗透攻防技术&#xff0c;是为了证明网络防御按照预期计划正常运行而提供的一种机制。就是通过模拟恶意…

C#:Krypton控件使用方法详解(第十三讲) ——kryptonDomainUpDown

今天介绍的Krypton控件中的kryptonDomainUpDown。下面介绍控件的外观属性和Item属性&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;Text属性&#xff1a;表示控件的显示文本内容&#xff0c;属性值为…

Apache HTTP Server <2.4.56 mod_proxy_uwsgi 模块存在请求走私漏洞(CVE-2023-27522)

漏洞描述 Apache HTTP Server 是一个Web服务器软件。 该项目受影响版本存在请求走私漏洞。由于mod_proxy_uwsgi.c 中uwsgi_response方法对于源响应头缺少检查&#xff0c;当apache启用mod_proxy_uwsgi后&#xff0c;攻击者可利用过长的源响应头等迫使应转发到客户端的响应被截…

单例模式(设计模式详解)

单例模式 描述 单例模式是一种创建型模式&#xff0c;它的目的是确保一个类只有一个实例&#xff0c;并提供全局访问点。这个实例可以被多个客户端共享&#xff0c;从而避免创建多个实例所带来的资源浪费和不必要的复杂性。 实现 懒汉模式 public class LasySingleton {priv…

数以千计的网站使用的FTP凭证被劫持

云安全初创公司 Wiz 警告说&#xff0c;一场广泛的重定向活动已经导致数千个针对东亚受众的网站使用合法的 FTP 凭据遭到破坏。 在许多情况下&#xff0c;攻击者设法获得高度安全的自动生成的 FTP 凭据&#xff0c;并使用它们劫持受害网站&#xff0c;将访问者重定向到成人主题…