C++--const成员及const取地址操作符重载

前言

今天我们来了解一下const成员的基本使用,以及const取地址重载的运用

来开始今天的学习

const成员

1.基本定义,

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的*this指针,表明在该成员函数中不能对类的任何成员进行修改。

一般使用如下:

因为this是隐藏的,使用时const放在函数参数括号之后,表示const Date*this 的作用

2,使用场景

此时可以保证*this的成员不被被修改可以用在一些不修改数时的情景,但是如果是一些计算等值会变化得函数,就不能使用它,比如int operator+=(const Date &d)是一个错误用法

3,const的调用权限

现在有几个问题,如果在函数中同时存在const  成员函数,与非const成员函数的话下面情况,会怎麽样

1. const对象可以调用非const成员函数吗?

是不可以的,这里有权限放大的错误,如下cosnt  的对象相当于d2传过出的是const Date*this,

而printf函数是默认的Date*this函数,那么this由原来的只读不写变成了可读可写,权限放大,会出现错误 

const Date d2(2024, 3, 1);
d2.printf();
void printf() //Date类里的函数
{cout << _year << " " << _month << " " << _day << endl;}

那么怎么修改上面的错误,答案是void printf()const,将非const成员函数变成const成员函数,如此也说明了cosnt对象可以调用cosnt成员函数

2. 非const对象可以调用const成员函数吗?

是可以的,这里有权限缩小,如下cosnt  的对象相当于d2传过出的是Date*this,

而printf函数是默认的const Date*this函数,那么this由原来的可读不写变成了只读可写,权限缩小,在c++中是允许的

 Date d2(2024, 3, 1);
d2.printf();
void printf()cosnt //Date类里的函数
{cout << _year << " " << _month << " " << _day << endl;}

3. const成员函数内可以调用其它的非const对象吗吗?

可以的,通过一个小例子来了解一下  bool Date::operator<( const Date &d) 下图是这样的现在运算符函数重载调用下面两个类的成员分别是一个cosnt成员,一个const成员     

  • 如果是d1<d2是可以调用的,因为d1默认变成Date*this,权限平移,而d2由const Data*this变成const Date&d,是权限平移,
  • 而如果是d2<d1是不对的因为d2是const Date*this 变成Date*this  权限放大了,是会报错的
    bool Date::operator<( const Date &d){}Date d1(2024,2,2);const Date d2(2024, 3, 1);d1<d2//是可以的d1变成Date*this 权限平移d2<d1 //d2变成Date*this 权限放大 d1缩小权限

总结:一般我们正常使用函数时最好调用const 避免一些不必要的麻烦,除了一些要改变值的数值的一些特殊情况,int operator+=(const Date &d)

4 取地址及const取地址操作符重载

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

1.替换CCS安装路径下的Flash.out文件 找到各自CCS的安装路径&#xff1a; D:\ti\ccs1230\ccs\ccs_base\c2000\flashAlgorithms 复制进芯电子国产DSP官网提供的配置文件 下载链接&#xff1a;https://mp.csdn.net/mp_download/manage/download/UpDetailed 2.替换原有文件 3.…

Object类的公共方法面试问题及回答

1. 什么是 Object 类&#xff1f; 答&#xff1a; Object 类是 Java 中所有类的超类。每个类都使用 Object 作为树的根&#xff0c;所有对象&#xff08;包括数组&#xff09;都实现这个类的方法。 2. Object 类中有哪些重要的方法&#xff1f; 答&#xff1a; equals(Obje…

GPT3 终极指南(二)

原文&#xff1a;zh.annas-archive.org/md5/6de8906c86a2711a5a84c839bec7e073 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第五章&#xff1a;GPT-3 作为企业创新的下一步 当一个新的创新或技术转变发生时&#xff0c;大公司通常是最后一个采纳的。它们的等级结构…

【学习vue 3.x】(五)VueRouter路由与Vuex状态管理

文章目录 章节介绍本章学习目标 路由的基本搭建与嵌套路由模式vue路由的搭建嵌套路由模式 动态路由模式与编程式路由模式动态路由模式编程式路由 命名路由与命名视图与路由元信息命名路由命名视图路由元信息 路由传递参数的多种方式及应用场景路由传参 详解route对象与router对…

【数学视野】Softmax 函数和 Gibbs 分布之间的数学桥梁

Softmax 函数和 Gibbs 分布之间的数学桥梁 文章目录 一、说明二、Softmax 函数的定义和组件三、从逻辑到多类的泛化3.1 连接到 Gibbs 分布3.2 统计力学背景3.3 切换到 Softmax 功能 四、优化和计算稳定性4.1 Softmax 的梯度4.2 链接到信息论 五、总结 一、说明 softmax 函数是各…

瘦身秘籍:如何使用 PyInstaller 打造超小型 Python 可执行文件

你是否曾经尝试过将你的 Python 程序打包成一个可执行文件&#xff0c;却发现生成的文件大得惊人&#xff1f;别担心&#xff0c;本文将教你如何使用 PyInstaller 尽可能减小生成的 onefile 大小&#xff0c;让你的程序轻盈如风&#xff01; 1. 使用虚拟环境 首先&#xff0c…

MyBatis(XML映射器操作)

文章目录 XML映射器操作&#xff08;XxxMapper.xml&#xff09;文件目录1.基本介绍1.优点2.常用顶级元素 2.环境配置1.在原来的父模块下创建一个子模块2.删除没用的两个文件夹3.创建基本目录4.父模块的pom.xml5.jdbc.properties6.mybatis-config.xml7.测试使用MonsterMapperTes…

【JS篇之】异常

前言&#xff1a;在代码编写过程中&#xff0c;最常遇到的就是程序异常。其实异常并非坏事&#xff0c;它可以让开发人员及时发现、定位到错误&#xff0c;提醒我们做正确的事情&#xff0c;甚至在某些时候&#xff0c;我们还会手动抛出异常。 1.异常的分类 在JS中&#xff0…

考研英语作文---写作要义

应用文结构 例题 信件 ------第一段写法 第一段 第二段 第三段 第一段 第三段 第二段 强调句方式开头方式 练习

【Vue 2.x】学习vue之一基础部分

文章目录 Vue 一基础部分第一章1、git两个分支主分支子分支 使用方法方式1&#xff1a;采用命令的方式操作分支方式2&#xff1a;在idea中使用git的分支 向git远程仓库提交时忽略文件使用git时的一些冲突注意事项 2、Vue问题1&#xff1a;什么是Vue&#xff1f;问题2&#xff1…

数据库(MySQL)—— DML语句

数据库&#xff08;MySQL&#xff09;—— DML语句 什么是DML语句添加数据给全部字段添加数据批量添加数据 修改数据删除数据 什么是DML语句 在MySQL中&#xff0c;DML&#xff08;Data Manipulation Language&#xff0c;数据操纵语言&#xff09;语句主要用于对数据库中的数…

金融案例:统一查询方案助力数据治理与分析应用更高效、更安全

随着企业数据规模的增长和业务多元化发展&#xff0c;海量数据实时、多维地灵活查询变成业务常见诉求。同时多套数据库系统成为常态&#xff0c;这既带来了数据管理的复杂性&#xff0c;又加大了数据使用的难度&#xff0c;面对日益复杂的数据环境和严格的数据安全要求&#xf…