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 ; // 日
};

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android4.4真机移植过程笔记(二)

5、盘符挂载 先定义overlay机制路径&#xff0c;后面storage_list.xml要用到&#xff1a; 在路径&#xff1a; rk3188_android4.4.1/device/rockchip/OK1000/overlay/frameworks/base/core/res/res/xml/定义好&#xff0c;注意名字要和emmc的代码片段&#xff08;往下面看&am…

python学习笔记----安装pycharm(1)

一、安装pycharm 1. 下载并安装pycharm https://www.jetbrains.com/pycharm/download2.汉化pycharm 安装插件并重启IDE完成汉化 二、 第一个python程序

Flask教程1:flask框架基础入门,路由、模板、装饰器

文章目录 一、 简介二、 概要 一、 简介 Flask是一个非常小的Python Web框架&#xff0c;被称为微型框架&#xff1b;只提供了一个稳健的核心&#xff0c;其他功能全部是通过扩展实现的&#xff1b;意思就是我们可以根据项目的需要量身定制&#xff0c;也意味着我们需要学习各…

分享天某云对象存储开发的体验

最近体验了天某云对象存储的功能&#xff0c;作为一名资深开发者&#xff0c;开发体验差强人意&#xff0c;与阿里云存在一定的差距。 首先在开发文档上居然没有基于nodejs的代码示例&#xff0c;只有java,c#,go等的代码示例&#xff0c;虽然有javascript的&#xff0c;但那也只…

Outlook大附件插件 有效解决附件大小限制问题

很多企业都是使用Outlook来进行邮件的收发&#xff0c;可是由于附件大小有限&#xff0c;导致很多大文件发不出去&#xff0c;就会产生Outlook大附件插件这种业务需求。 邮件系统在发送大文件时面临的限制问题主要如下&#xff1a; 1、附件大小限制&#xff1a;大多数邮件服务…

net lambda 、 匿名函数 以及集合(实现IEnumerable的 如数组 、list等)

匿名函数&#xff1a;》》》 Action a1 delegate(int i) { Console.WriteLine(i); }; Lambda:>>> Aciont a1 (int i) > { Console.WriteLine(i); }; 可以简写 &#xff08;编译器会自动根据委托类型 推断&#xff09; Action a1 &#xff08;i&#xff09;> {…

前端vite+rollup前端监控初始化——封装基础fmp消耗时间的npm包并且发布npm beta版本

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐初始化npm项目&#x1f496;type为module&#x1f496;rollup.config.js ⭐封装fmp耗时计算的class&#x1f496;npm build打包class对象 ⭐发布npm的beta版本&#x1f496; npm发布beta版本 ⭐安装web-performance-tool的beta版本…

springcloud自定义全局异常

自行创建一个实体类 /*** 全局异常处理类**/ ControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(Exception.class) ResponseBody public Result error(Exception e){e.printStackTrace(); return Result.fail();}/*** 自定义异常处理方法* param e * re…

GPU 架构与 CUDA 关系 并行计算平台和编程模型 CUDA 线程层次结构 GPU 的算力是如何计算的 算力峰值

GPU 架构与 CUDA 关系 本文主要包含 NVIDIA GPU 硬件的基础概念、CUDA(Compute Unified Device Architecture)并行计算平台和编程模型,详细讲解 CUDA 线程层次结构,最后将讲解 GPU 的算力是如何计算的,这将有助于计算大模型的算力峰值和算力利用率。 GPU 硬件基础概念GP…

GB32960解析工具

几年前搞了一个用Qt开发的国标32960报文解析工具。分享给大家&#xff0c;只用1积分便可以下载。 国标32960新能源车协议解析工具资源-CSDN文库

数据结构—C语言实现双向链表

目录 1.双向带头循环链表 2.自定义头文件&#xff1a; 3.List.cpp 文件 3.1 newnode()函数讲解 3.2 init() 函数 初始化 3.3 pushback()函数 尾插 3.4 pushfront()函数 头插 3.5 popback() 尾删 3.6 popfront() 函数 头删 3.7 insert()函数 在pos之后插入 3.8 popbac…

【JS篇之】异常

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

Linux - nohup 后台启动命令

目录 1. nohup启动 2. nohup与&&#xff0c;后台运行 3. nohup与>&#xff0c;日志重定向 4. nohup后台启动-综合使用(推荐) 5. 文件描述符-0 1 2 6. 知识扩展 6.1 不停止服务&#xff0c;直接清空nohup.out 6.2 只记录警告级别比较高的日志 6.3 不想输出日志 …

c#word文档:1.创建空白Word文档及保存/2.添加页内容...

---创建空白Word文档 --- &#xff08;1&#xff09;创建一个名为OfficeOperator的类库项目。引用操作Word的.NET类库 &#xff08;2&#xff09;定义用于操作Word的类WordOperator1。添加引用Microsoft.Office.Interop.Word命名空间。 &#xff08;3&#xff09;为WordOper…

C#知识|汇总方法重载与静态方法应用技巧

哈喽&#xff0c;你好&#xff0c;我是雷工&#xff01; 今天学习C#方法重载与静态方法应用技巧的相关内容。 01 方法重载有什么好处&#xff1f; 1.1、可以有效的减少类的对外接口&#xff08;只显示一个方法比较简洁&#xff09;&#xff0c;从而降低类的复杂度。 1.2、方便…

Python 与 TensorFlow2 生成式 AI(一)

原文&#xff1a;zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 “想象力比知识更重要。” – 阿尔伯特爱因斯坦&#xff0c;《爱因斯坦关于宇宙宗教和其他见解与格言》&#xff08;2009&#xff09;…

【Go 语言入门专栏】Go 语言的起源与发展

前言 Go 语言是当下最为流行的编程语言之一&#xff0c;大约在 2020、2021 年左右开始于国内盛行&#xff0c;许多大厂很早就将部分 Java 项目迁移到了 Go&#xff0c;足可看出其在性能方面的优越性。 相信各位都知道&#xff0c;在爬虫业务中&#xff0c;并发是一个关键的需…

安居水站:古斯塔夫·勒庞:揭秘群体心理的力量

“群众从来不渴求真理。 他们回避那些让他们不高兴的事实&#xff0c;而更喜欢崇拜能够诱惑他们的错误。凡是懂得欺骗她的人&#xff0c;都容易成为她的主人&#xff0c;凡是试图开导她的人&#xff0c;永远都是她的牺牲品。”古斯塔夫勒邦-群体心理学/古斯塔夫勒邦&#xff08…

哈希(hash)函数

本文已收录至《全国计算机等级考试——信息 安全技术》专栏 哈希函数&#xff0c;也称为散列函数 或杂凑函数&#xff0c;指将哈希表中元素的关键键值映射为元素存储位置的函数。是一种将任意长度的数据映射到固定长度输出的函数。哈希函数的特点包括压缩性&#xff0c;即输入数…

袁庭新ES系列18节|Spring Data Elasticsearch高级

前言 这一章节袁老师将带领同学们来学习Spring Data Elasticsearch高级操作相关的内容。我们继续来探索SDE是如何将原始操作Elasticsearch的客户端API进行封装的&#xff0c;以及通过Spring Data Elasticsearch如何来操作ES。准备好了吗&#xff1f;我们继续来探索ES的内容。 …