当前位置: 首页 > news >正文

c++之说_15|成员函数的const尾缀修饰 ( const const)

我记得我刚接触c++的时候  遇到成员函数 右边尾部  写了个const 我当时就很蒙 
不过慢慢的也从大佬口中获得一二经验了

class kj{public:void get(){printf("无修饰\n");}void get()const{printf("const 修饰\n");}};

大概就是这个样子  当时我抓耳挠腮的看不懂啊  怎么写法没学过呢(学得少了)

main函数调用

int main()
{kj f = kj();const kj f2 = kj();f.get();f2.get();return 0;
}

结果

我们都知道const对象是不希望改变的  但是我们写的很多成员函数都或多或少的 改变了this对象

所以const尾缀修饰的成员函数  就是专门给 const对象调用的  const对象没有资格调用非const尾缀修饰的成员函数

在指针上也是一样的

kj* pf = &f;
const kj* pf2 = &f2;
pf->get();
pf2->get();

有人会说 非const 对象  难道就没法调用 const尾缀修饰的函数了吗?

当然是可以的  但是反过来就不行了

kj f = kj();
f.get();

最近我见到一个用&  &&  const &  const&& 尾缀修饰的

烧是真的烧

所以来看看

class kj{public:void get()&&{printf("&&\n");}void get()const&&{printf("const &&\n");}void get()&{printf("&\n");}void get()const&{printf("const &\n");}};

main

int main()
{const kj&& pp1 = kj();const kj& pp2 = kj();kj f = kj();const kj f2 = kj();kj& pp3 =f;kj&& pp4 = kj();f.get();f2.get();pp1.get();pp2.get();pp3.get();pp4.get();kj().get();const kj().get();return 0;
}

我们看到

f 是一个左值对象(变量) 调用的是 & 尾缀修饰的函数

f2 是const 修饰的左值对象(变量) 调用的是const & 尾缀修饰的函数

pp1 是const 修饰的右值引用对象(变量) 调用的是const & 尾缀修饰的函数

pp2 是const 修饰的左值引用对象 (变量)调用的是const & 尾缀修饰的函数

pp3 是左值引用对象(变量)调用的是 & 尾缀修饰的函数

pp4 是右值引用对象(变量)调用的是 & 尾缀修饰的函数

kj().get(); 完全的右值临时对象调用 get函数 调用的是 && 尾缀修饰的函数
const kj().get(); 完全的const 右值临时对象调用 get函数 调用的是const && 尾缀修饰的函数

大家是不是好奇 pp1 pp4 明明是右值引用的对象(变量) 为啥调用的是 左值引用尾缀修饰的函数 

之前说过  有名的右值叫左值  

所以她两就是本就是左值  因为有名了  右值引用 引用的那一刻 她们便有了名字

kj()这种才叫无名右值 还有 函数返回值(非左值引用返回)  也属于无名右值  


kj create1()
{auto n = kj();return n;
}
kj&& create2()
{return kj();
}///
create1().get();
create2().get();

还有就是  &  和 const &  与  无修饰  和 const 修饰的  一样 无法重写
    

参考代码

class kj{public:/*void get(){printf("无修饰\n");}*//*void get()const{printf("const 修饰\n");}*/void get()&&{printf("&&\n");}void get()const&&{printf("const &&\n");}void get()&{printf("&\n");}void get()const&{printf("const &\n");}/*void get(){printf("const &\n");}void get()const{printf("const");}*/};kj create1()
{auto n = kj();return n;
}
kj&& create2()
{return kj();
}int main()
{const kj&& pp1 = kj();const kj& pp2 = kj();kj f = kj();const kj f2 = kj();kj& pp3 =f;kj&& pp4 = kj();f.get();f2.get();/*kj* pf = &f;const kj* pf2 = &f2;pf->get();pf2->get();*/pp1.get();pp2.get();pp3.get();pp4.get();kj().get();const kj().get();create1().get();create2().get();return 0;
}

相关文章:

  • 程序员们,能告诉我你们为什么选择arch linux吗?
  • LINUX内核权限提升漏洞(CVE-2024-1086)通告
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 目录管理器(200分) - 三语言AC题解(Python/Java/Cpp)
  • 【Science Data Bank】数据集下载脚本
  • python-日历库calendar
  • maven学习小结
  • ubuntu 22.04 升级到24.04
  • 手机号码的校验
  • 【昇思25天学习打卡营打卡指南-第一天】基本介绍与快速入门
  • 三分忙,七分瞎忙!明天起,做个清闲的打工人~
  • H5禁止页面缩放的方法汇总
  • 确保数据一致性
  • 相机的标定
  • LeetCode206-反转链表
  • 常用的Excel函数
  • 【Linux系统编程】快速查找errno错误码信息
  • AngularJS指令开发(1)——参数详解
  • crontab执行失败的多种原因
  • ECMAScript6(0):ES6简明参考手册
  • Elasticsearch 参考指南(升级前重新索引)
  • Fastjson的基本使用方法大全
  • Java 23种设计模式 之单例模式 7种实现方式
  • linux学习笔记
  • php的插入排序,通过双层for循环
  • Python利用正则抓取网页内容保存到本地
  • Vue.js-Day01
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  •  一套莫尔斯电报听写、翻译系统
  • 硬币翻转问题,区间操作
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • AI算硅基生命吗,为什么?
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • # SpringBoot 如何让指定的Bean先加载
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (23)mysql中mysqldump备份数据库
  • (C#)获取字符编码的类
  • (Python第六天)文件处理
  • (zhuan) 一些RL的文献(及笔记)
  • (ZT)出版业改革:该死的死,该生的生
  • (八)Spring源码解析:Spring MVC
  • (第30天)二叉树阶段总结
  • (二)windows配置JDK环境
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (六)DockerCompose安装与配置
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (七)理解angular中的module和injector,即依赖注入
  • (算法)求1到1亿间的质数或素数
  • (转)LINQ之路
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET MVC第五章、模型绑定获取表单数据