【C++】初级—类和对象之赋值运算符重载、取地址操作符重载和const修饰的取地址运算符重载

2023-10-30

在上一篇中写到,一个类会产生的6种默认函数中的前三个默认函数:
1.构造函数
2.析构函数
3.拷贝构造函数
4.赋值运算符重载
5.取地址操作符重载
6.拷贝构造函数

这次将着重讲解后三个函数。


赋值运算符重载

运算符重载

~什么是运算符重载呢?

~在构造函数中,曾提到过,C++将类型分为自定义类型和内置类型。而对于已经存在的运算符(==、+、-、*…)来说,它们其实只支持内置类型,并不支持自定义类型。那么,如果存在一个日期类型,我们想要比较两个日期是否相等,要怎么办呢?因此就产生了运算符重载这一说法,使用operator将 == 重新定义一种输出方式就好了。

operator

函数原型:返回类型+operator+要重载的操作符+(参数列表)
举个栗子叭:

#include<iostream>
using namespace std;
class Date
{
	public:
		Date(int year = 1900,int month = 1,int day = 1)
		{
			_year = year;
			_month = month;
			_day = day;
		}
		// bool operator==(Date* this, const Date& d2)
 		// 这里需要注意的是,左操作数是this指向的调用函数的对象
		bool operator == (const Date& d)
		//将赋值运算符==重载,即 == 可支持自定义类型的日期类 进行比较是否相等
		{
			return _year == d._year && _month == d._month && _day == d._day;
		}
	private:
		int _year;
		int _month;
		int _day;
};
int main()
{
	Date d1(2019,9,18);
	Date d2(2018,9,18);
	cout<<(d1 == d2)<<endl;
	return 0;
}

下面是可以进行重载的运算符:

在这里插入图片描述
下面是不可以进行重载的运算符:

  • 成员访问运算符:.
  • 成员指针访问运算符:->*, .*
  • 域运算符:::
  • 长度运算符:sizeof
  • 条件运算符:?:
  • 预处理运算符:#
    要注意的是:
    1.不能再去重载除了以上允许的符号以外的符号:例如 operator $;
    2.重载运算符必须有一个类类型或者枚举类型的操作数;
    3.用于内置类型的操作符,其原意不能改变:即+你可不能重载成减法什么的;
    4.作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的
    操作符有一个默认的形参this,限定为第一个形参;
赋值运算符

直接上代码!

#include<iostream>
using namespace std;
class Date
{
	public:
		Date(int year = 1900,int month = 1,int day = 1)
		{
			_year = year;
			_month = month;
			_day = day;
		}
		Date& operator =(const Date& d)
		{
			if(*this != &d)
			{
				_year = d._year;
				_month = d._month;
				_day = d._day;
			}
			return *this;
		}
	private:
		int _year;
		int _month;
		int _day;
};
int main()
{
	Date d1(2019,9,18);
	Date d2;
	d2 = d1;
	return 0;
}

注意:赋值运算符重载有以下四点需要注意:

  • 参数类型
  • 返回值
  • 检测是否自己给自己赋值
  • 返回*this
  • 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。

const成员

const修饰的类成员函数实际上修饰的是该函数隐含的this指针,这就表明着,在这个函数中,你无法修改this指针指向的对象。

例如:

#include<iostream>
using namespace std;
class Date
{
	public:
		Date(int year = 1900,int month = 1,int day = 1)
		{
			_year = year;
			_month = month;
			_day = day;
		}
		//实际上是void display(const Date *this)
		void display() const
		{
			cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
		}
		
	private:
		int _year;
		int _month;
		int _day;
};
int main()
{
	Date d1(2019,9,18);
	return 0;
}

对于一个对象来说,它的权限只能被缩小,不能被放大:比如一个对象可读可写,那么它可以被const修饰让它变成只读的;但是一个只读的却不能通过引用或者指针去修改它。


取地址操作符重载

这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
例如:

class Date
{
public :
	 Date* operator&()
	 {
		 return this ;
	 }

 const Date* operator&()const
 {
 	 return this ;
 }
private :
	 int _year ; // 年
	 int _month ; // 月
	 int _day ; // 日
};

注意:这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如希望让别人获取到指定的内容等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】初级—类和对象之赋值运算符重载、取地址操作符重载和const修饰的取地址运算符重载 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 区块链-技术简介

    1 什么是区块链 区块链技术是利用块链式数据结构来验证与存储数据 利用分布式节点共识算法来生成和更新数据 利用密码学的方式保证数据传输和访问的安全 利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式 简单
  • 复制CSDN的BLOG代码,去掉前面行号的方法

    我们如果从CSDN的BLOG复制代码 出现前面的行号 比如 1 文本没有缩写 2 Specify blanket rules for all elements 3 font size 12px 4 line height 160 5 fon
  • 关于java静态方法里只能调用静态变量的思考

    最近一段时间里面写了这样一个类 public class DBManager private static MySqliteHelper helper public static MySqliteHelper getHelper Conte
  • Geotools与OGC(二)----WKT坐标系信息的读取

    WKT除了有针对几何信息的描述外 也有针对空间参考的描述 以下我直接套用OGC规范中的描述 https www osgeo cn doc ogcstd ogc standard ch02 chapter1 chapter html wkb
  • 每天坐6小时以上,死亡率会增高——但站着工作就管用吗?

    此篇文章来自一篇科普类文章 作为IT行业人士 每天坐着的时间几乎都已超过了6小时 我们这些久坐的同仁儿们需要关注自己的健康 运动是我们健康的砝码哦 英文原文 Why I killed my standing desk 想必很多上班族都深受颈
  • 为什么老程序员的效率如此高?

    首先 优秀得神枪手一定是靠子弹喂出来得 没有几千上万个子弹得真枪实战 就很难在战场上一击枪杀敌人 我经常会看到一些新手程序员在写代码的时候需要频繁的去查看文档或者是百度搜索各种接口的用法 有时写一个功能要查个几十次 很多时间都浪费在了搜索上
  • upload-labs大详解

    pass1 上传一个php一句话文件 记得改成php格式 发现不允许上传php类型的 只能上传jpg gif pngl的我们打算用burp抓包 先上传jpg的 然后用burp改成php的 放包后 找到它的存储位置 用蚁剑连接 成功连接 pa
  • ReactNative常用插件使用

    项目版本介绍 目前使用的项目node版本v14 17 5 npm版本6 14 14 reactNative项目使用的模板结合typescript语法的项目模板架构 安装的方式如下 npx react native init xxx 项目名
  • TensorFlow团队成员说:深度学习的未来,在单片机的身上

    便携栗 编译自 Pete Warden s Blog量子位 出品 公众号 QbitAI Pete Warden 是谷歌TensorFlow团队成员 也是TensorFLow Mobile的负责人 常年遨游在深度学习的大海 另外 这些看上去很
  • 如何判断视频的比例(4:3/16:9)和分辨率?

    如何区分16 9和4 3 将 视频分辨率的宽度除以高度 运算结果接近1 7的是16 9 超过1 77都归类为16 9 运算结果接近1 3的4 3 例如您要上传的视频分辨率是 640 480 用640 480 1 33 那么这个就是一个4 3
  • 阿里云服务器型号大全及机型如何选择(建议收藏)

    不同的阿里云实例规格可以提供的计算能力不同 适用于不同的业务场景和使用场景 1 根据使用场景来选择 下图显示了阿里云ECS的部分通用计算和异构计算实例规格族及其对应的业务场景 简单来看 g6e和g6型能够满足一般的通用需求 对于比如金融 政
  • electron打包:electron-packager及electron-builder两种方式实现桌面端应用程序打包

    electron vue初始化 electron vue初始化命令 vue init simulatedgreg electron vue my project 我们在初始化electron vue项目时 可以选择打包方式 electron
  • vue——移动端在线预览pdf并能缩放(pdfh5)

    最近接了一个需求需要在移动端预览pdf 并切要能缩放 百度发现大多推荐vue pdf 但是vue pdf这个包 安装之后运行报错 解决之后的实现效果不符合需求需要 而且 实现缩放功能的时候 整个canvas画布整个放大 虽然有放大效果 但是
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • GLSL ES中的布局限定符(layout)

    一 存储限定字 首先需要了解存储限定字才能正确认识布局限定符 在webGL中要实现着色器和JS代码之间的数据交互 主要靠三类变量 分类的依据是存储限定字 分别是 attribute uniform varying 其中attrbute和un
  • 校招笔试面试---算法题1

    牛牛取快递 dijkstra 邻接表存图 优先队列 链接 https www nowcoder com questionTerminal 071695ed1d0b4e65b07eb969d212b92a 来源 牛客网 时间限制 1秒 空间限
  • 用批处理完全卸载mysql,完全卸载mysql(停止服务、卸载相关程序、删除注册表

    1 停止服务MySQL 2 卸载mysql相关的程序 3 删除注册表 运行 gt regedit machine gt system gt controlset001 controlset002 currentcontrolset gt s
  • Qt5下遍历QList的方法

    lines定义如下 QMap
  • 阿波罗无法通过链接外网

    官方提供说明 官方地址 无法连接外网的原因通常是阿波罗走到内网 通过注册中心无法连接到服务 bin bash apollo config db info apollo config db url jdbc mysql localhost 3
  • 【C++】初级—类和对象之赋值运算符重载、取地址操作符重载和const修饰的取地址运算符重载

    在上一篇中写到 一个类会产生的6种默认函数中的前三个默认函数 1 构造函数 2 析构函数 3 拷贝构造函数 4 赋值运算符重载 5 取地址操作符重载 6 拷贝构造函数 这次将着重讲解后三个函数 赋值运算符重载 运算符重载 什么是运算符重载呢