C++类和对象(2)——取地址运算符重载

news2024/11/26 20:23:20

一、const成员函数

const放在成员函数参数列表后面进行修饰,那么这个成员函数就是const成员函数;const实际修饰的是成员函数形参中包含的this指针的形参,表明在这个成员函数内部不能对成员进行修改。

例如日期类里面的Print成员函数,它的形参是Date* const this,用来接收实参&d,那么在这个Print函数参数列表后面加上const,Print函数隐含参数就成了 const Date* const this,那么就不能通过这个this指针来改变指向的对象的数据成员了。

const不能修饰默认成员函数,默认成员函数编译器可以自动生成,函数内部对对象的修改是根据类的不而来变化的,也就是说默认成员函数中对象的可修改性不能由const来决定。

###代码示例:

//const修饰成员函数
class Date
{
public:
	Date() 
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}
	void Print( )const //实际参数是const Date* const this
	{
		cout << _year << " " << _month << " " << _day << endl;
	}
	bool operator==(const Date& d) const//实际参数是const Date* const this,const Date& d
	{
		return _year == d._year &&
			_month == d._month &&
			_day == d._day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	Date d2;
	d1.operator==(d2);//实参是&d1(参数类型是Date*)、d2;
	d1.Print();//实参是&d1,参数类型是Date*
	d2.Print();//实参是&d1,参数类型是Date*

	const Date d3;
	const Date d4;
	d3.operator==(d4);//实参是&d3(参数类型是 const Date*)、d4
	d3.Print();//实参是&d3,参数类型是(const Date*)
	d4.Print();实参是&d4,参数类型是(const Date*)
	return 0;
}
  • d1、d2都是Date类型,重载运算符 (==)  函数传参是Date* 和Date,const成员函数(operator==) 的形参是 const Date* const this,const Date& d,实参相较形参是访问权限的缩小,不会有问题;同理成员函数 Print() 也是;
  • d3、d4都是const Date类型,看到它们的Print() 函数,那么实参就是&d3或者&d4,对应的类型是const Date*,const成员函数恰好接收的就是const修饰指针指向的是对象内容的实参,那么这里就是访问权限的对等,自然不会有问题;

所以,给const成员函数传参时,传的可以是类的指针类型的实参,也可以是const修饰类的指针类型的实参;当然,const成员函数const是为了保证this指向的对象不被修改的,那么这个const修饰的成员函数定义时,自然不能出现要修改this指向的对象的行为。

###为理解透彻,再来看非const成员函数传参时访问权限放大的错误代码:

  • d1类型是const Date,那么这个对象的成员是不能被修改的;此时调用Print()函数,传参实参是const Date*,但是形参是Date* const this,这个形参的意思是:this指针本身不能被修改,但是this指向的对象是可以被修改的,那么显然这时权限放大了,是错的;要解决,要么去掉const Date d1前的const,将d1类型改为Date;要么给Print()函数参数列表后面加上const,使其成为const成员函数。

二、取地址运算符重载

取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,一般来说,取地址运算符重载是不需要我们实现的,编译器自己生成的就可以满足我们的需求;

###代码示例:

class Date
{
public:
		Date(int year=9,int month=1,int day=1)
		{
			_year = year;
			_month = month;
			_day = day;
		}
		//普通的取地址运算符重载
		Date* operator&()
		{
			return this;
		}
		//const取地址运算符重载
        //返回类型是const Date*,是因为const修饰了
		const Date* operator&()const
		{
			return this;
		}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	cout << &d1 << endl;
	const Date d2;
	cout << &d2 << endl;
}

 

仅靠编译器生成的默认取地址运算符重载也能取到类的地址:

 

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

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

相关文章

【HarmonyOS NEXT星河版开发学习】综合测试案例-拼夕夕首页

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 该实战案例并没有用到太多的知识点&#xff0c;只不过用到的一些新东西&#xff0c;要多花时间去熟悉手机app的一些页面&#xff0c;对…

【Python】Python单元测试基础

文章目录 01-单元测试基础什么是单元测试常用的文件结构运行单元测试 01-单元测试基础 什么是单元测试常用的文件结构编写第一个单元测试运行单元测试 什么是单元测试 单元测试是指一个自动化的测试&#xff1a; 用来验证一小段代码&#xff08;单元&#xff09;的正确性&#…

【LLM】医疗大语言模型:CareGPT

向AI转型的程序员都关注公众号 机器学习AI算法工程 CareGPT (关怀GPT)是一个医疗大语言模型&#xff0c;同时它集合了数十个公开可用的医疗微调数据集和开放可用的医疗大语言模型&#xff0c;包含LLM的训练、测评、部署等以促进医疗LLM快速发展。 特性&#xff1a; 添加ChatG…

【Datawhale AI 夏令营】动手学大模型应用开发Task1 Baseline 精读

【Datawhale AI 夏令营】动手学大模型应用开发Task1 Baseline 精读 开源大模型文件预览 Baseline 1.导入库 # 导入所需的库 from transformers import AutoTokenizer, AutoModelForCausalLM import torch import streamlit as st2.模型下载 # 源大模型下载 from modelscope…

将电脑打造成私人网盘,支持外网访问之详细操作教程

你想过把自己电脑打造成随时随地访问的网盘吗&#xff1f;就是那种拥有一个属于自己的影音库&#xff0c;不用担心被和谐&#xff0c;随时可以登录访问电脑上的各种文件&#xff0c;相比传统网盘省心又安全。 使用Everything和节点小宝将电脑搭建成私人网盘&#xff0c;可以实现…

嵌入式面经篇三——数据类型

文章目录 前言一、数据类型1、用变量 a 给出下面的定义2、下面的代码输出是什么&#xff0c;为什么&#xff1f;3、写出 float x 与“零值”比较的 if 语句。4、下面代码有什么错误&#xff1f;5、下面代码输出是什么&#xff1f;6、下面代码运行后会是什么现象&#xff1f;7、…

24年日语能力(JLPT)考试报名流程图解

报名方式 搜索JLPT中国教育考试网&#xff0c;在线报名&#xff0c;一般学生党从教育网入口登录&#xff0c;社会人士从公网入口登录 报名时间 N1-N5 8月20日 7:00 - 8月27日14:00 注册时间 8月13日7:00 - 8月27日14:00 报名步骤 阅读报考提示&#xff0c;注册个人信息→…

此处不允许使用 ‘空‘ 类型

说明&#xff1a;受最近看的书《设计模式之美》&#xff08;小争哥&#xff09;的影响&#xff0c;最近编码有意将一些业务逻辑写在对象里面&#xff0c;增强封装性。在此记录一次项目启动时的报错&#xff0c;如下&#xff1a; 原因&#xff1a;当你在实体类对象中&#xff0c…

UniApp开发的开源工厂设备管理维护系统

本文来自&#xff1a;UniApp开发的开源工厂设备管理维护系统 - 源码1688 前端小程序演示地址&#xff1a; 后台测试网址&#xff1a; https://shebeiguanli.azheteng.cn/pyswkAWtig.php/addon?refaddtabs 测试账户&#xff1a; admin 测试密码&#xff1a; admin888 前端…

【Python】python泰坦尼克号生存预测 (源码+数据集+PPT+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

黑神话悟空游戏攻略大全 黑神话悟空内存占用多少 国产3A级游戏《黑神话:悟空》评测代码已发 黑神话悟空测试画质130g MacBook可以玩黑神话悟空吗

《黑神话&#xff1a;悟空》的评测代码已向媒体与测评人员发放&#xff0c;评测解禁日期定在8月16日。目前发放的评测代码仅限于PC版&#xff0c;并未涉及PS5版。《黑神话&#xff1a;悟空》将于8月20日发售&#xff0c;登陆PC(Steam/Epic/WeGame)和PS5。玩家将扮演一位“天命人…

Mybatis原理分析

一、总结 MyBatis的基本工作原理就是&#xff1a;先封装SQL&#xff0c;接着调用JDBC操作数据库&#xff0c;最后把数据库返回的表结果封装成Java类。 1. JDBC有四个核心对象&#xff1a; &#xff08;1&#xff09;DriverManager&#xff0c;用于注册数据库连接。 &#xf…

基于单片机的智能楼道灯光控制系统设计

摘要&#xff1a;基于单片机的智能楼道灯光控制系统设计由人体感应模块、光照强度检测模块、灯光控制模块、声音传感器模块、声光报警模块等组成。以单片机为核心&#xff0c;通过检测光照强度和红外人体感应相结合&#xff0c;实现了对楼道内灯光的控制&#xff0c;从而达到节…

vue-cli 中 配置 productionSourceMap 为 false 失效?

背景 最近 发现 vuecli 构建的 项目中配置的 productionSourceMap 为 false 后 &#xff0c;生产代码 还是能够看到 sourceMap 文件 。 原因 生效前提条件 得设置 NODE_ENV 为 production 才会生效&#xff01; 解决 直接修改生产环境的配置 NODE_ENV 为 production 直接覆…

二.PhotoKit - 相册权限(彻底读懂权限管理)

引言 用户的照片和视频算是用户最私密的数据之一&#xff0c;由于内置的隐私保护功能&#xff0c;APP只有在用户明确授权的前提下才能访问用户的照片库。从iOS14 开始&#xff0c;PhotoKit进一步增强了用户的隐私控制&#xff0c;用户可以选择指定的照片或者视频资源的访问权限…

阿里淘天landing,是结束也是新的开始(附校/社招内推码)

阿里3个多月landing成功&#xff0c;是结束也是新开始&#xff0c;望我们往后一切顺利~ 因为个人发展规划&#xff0c;今年开始找工作&#xff0c;但负责的业务实在繁忙&#xff0c;所以一边面试一边整理资料&#xff0c;每天都在挤海绵。 今年的就业形势着实不乐观&#xff0c…

NPN传感器与汉姆485总线驱动器限位功能使用

传感器输出的引脚电平是由传感器是常闭还是常开决定的&#xff1b;light on和 dark on决定的是触发信号&#xff1b; PNP-NO常开&#xff1a;在没有信号触发时&#xff0c;输出线是悬空的&#xff08;即VCC电源线和OUT线断开&#xff09;&#xff0c;输出为低电平或不确定状态…

【推荐】免费一年期的SSL证书现在哪里可以申请到

免费一年期的SSL证书虽然不像以前那样普遍易得&#xff0c;但仍有部分途径可以申请到。以下是一些可能的申请渠道&#xff1a; JoySSL 特点&#xff1a;JoySSL是自主品牌SSL证书&#xff0c;安全性和兼容性都有保障。它提供教育版和政务版域名的一年期免费DV单证书。申请流程&…

java中RSA分段加解密及Data must not be longer than异常处理

谈到RSA非对称加密&#xff0c;作为开发的我们第一想到的是安全&#xff0c;几乎不会被破解&#xff0c;以及公钥加密&#xff0c;私钥解密这些。在Java代码中&#xff0c;我们常使用一些现成的工具类如hutool中提供的工具类、网上在线的或者博客上的RSAUtils工具类来实现公钥私…