【C++】C/C++中新const用法:const成员

欢迎来到CILMY23的博客

本篇主题为: C/C++中新const用法:const成员

个人主页:CILMY23-CSDN博客

系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux

感谢观看,支持的可以给个一键三连,点赞关注+收藏。


写在前头:

在接触C++中 const成员前,我们可以先复习一下C/C++中两种 const 的用法。在指针的入门篇我们写过的知识点(链接),我们主要分为以下两种情况:

  • const关键字可以限制变量不被修改,但是存在可以用指针修改的情况
  • const如果放在 * 的左边,限制的是指针所指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本⾝的内容可变。 
  • const如果放在 * 的右边,限制的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针所指向的内容,可以通过指针改变
  •  如果 两边都有const,那它就会集齐两者,使其变成完全不能修改的指针变量。

那现在函数名称后面居然可以写上const了?那它又是什么意思呢? 


目录

一、认识const成员

二、const成员的概念及特点

2.1 const 成员的概念

2.2 const成员函数的四个问题

2.3 权限的放大什么时候存在?

三、取地址重载和const取地址重载


一、认识const成员

继上篇日期计算器后,现在有一个问题

我们来看这段代码:

在main函数中,我们用 const 修饰了对象 ,

int main()
{const Date d1(2024, 5, 6);d1.Print();return 0;
}

但是这里却无法访问到Print() 成员函数,其实这里涉及权限的放大 

 那如果我们想让它变成可访问的,那就要在成员函数后面增加 const ,这个const修饰的是this指针指向的内容。

//Date.cpp
//日期打印
void Date::Print() const
{cout << "当前日期:"<< _year << "/"<< _month << "/"<< _day<< endl;
}//Date.h
//日期打印
void Print() const;

我们把这里的Print(),就称为const成员函数。 

二、const成员的概念及特点

2.1 const 成员的概念

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

注意:并不是所有的成员函数都需要用const修饰,如果只有读取的类成员函数,那么可以加,如果需要修改类成员变量,那就不能加const。 

2.2 const成员函数的四个问题

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

第一个:const对象可以调用非const成员函数吗?

答:不能,因为这里存在权限的放大,d1是const对象,但它不能调用非const成员函数,

第二个: 非const对象可以调用const成员函数吗?

答:可以,这样是权限的缩小,是允许的。

 

 第三个:const成员函数内可以调用其它的非const成员函数吗?

答: 不行,因为这是权限的放大

第四个:非const成员函数内可以调用其它的const成员函数吗?

答:可以,这是权限的缩小 

2.3 权限的放大什么时候存在?

 只有指针和引用才存在权限的放大。

例如: 

三、取地址重载和const取地址重载

类的默认成员函数还剩下取地址重载和const取地址重载,这两个默认成员函数一般不用重新定义,编译器默认会生成。

例如: 

class A
{
public:A* operator&(){return this;}const A* operator&() const{return this;}
};int main()
{A aa1;const A aa2;cout << &aa1 << endl;cout << &aa2 << endl;return 0;
}

 结果如下:

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


总结:

  • 函数后面有 const ,这个const修饰的是this指针指向的内容。
  • 权限可以平移或者缩小,但不可以放大
  • 成员函数,如果是一个对成员变量只进行读访问的函数,那么建议加 const,这样const对象和非const对象都可以使用
  • 成员函数,如果是一个对成员变量要进行读写访问的函数,那么不能加 const,否则不能修改成员变量。
  • const不能加在日期计算器中的流插入和流提取中,因为它没有this指针。
  • 比如想让别人获取到指定的内容,我们才需要重载&运算符const &

感谢各位同伴的支持,本期C++就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞关注+收藏,若有不足,欢迎各位在评论区讨论。    

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

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

相关文章

探索智慧生活:百度Comate引领人工智能助手新潮流

文章目录 百度Comate介绍1. 什么是百度Comate&#xff1f;主要特点 2. Comate的核心功能智能问答功能语音识别功能语音助手功能个性化服务 使用教程(以vscode为例)1. 下载和安装Comate2. 插件配置方式1&#xff1a;无License用户方式2&#xff1a;购买License用户 3. 常用操作快…

元素设置 flex:1,但是会被内部长单词宽度超出拉伸

初始布局如上图&#xff0c;left中是代码编辑器&#xff0c;实际上是个文本域&#xff0c;当输入长文本过长时&#xff0c;left宽度会被拉伸。 右侧容器被挤压。 解决方案&#xff1a;width&#xff1a;0&#xff1b; .left{flex:1; width:0} 当输入长文本过长时&#xff0c…

CCF-Csp算法能力认证,202206-1归一化处理(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…

马化腾用“不负众望”,来评价视为“全村希望”的视频号

我是王路飞。 2023年的视频号&#xff0c;给了腾讯足够的惊喜。 去年一年&#xff0c;视频号电商GMV实现近3倍增长&#xff08;约为1200亿&#xff5e;1500亿&#xff09;。2023年三季度&#xff0c;视频号总播放量同比增长超50%&#xff1b; 2023年视频号供给数量同比增长超…

怎么用git在暂存区(stage)中移除不需要提交(commit)的文件?

2024年5月9日&#xff0c;周四上午 非常简单&#xff0c;用下面这条命令就可以了 git rm --cached <file>注&#xff1a;这条命令不会把文件从文件夹中删除&#xff0c;只会把文件从暂存区中移除出去 实战

企业微信hook接口协议,ipad协议http,设置是否自动同意

设置是否自动同意 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"bc4800492083fdec4c1a7e5c94","state":1 //1 是需要验证同意&#xff08;需要手动点击同意&#xff09; 0关闭验证…

鸿蒙开发-ArkTS语言-容器-非线性容器

鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 文章目录 前言 一、非线性容器 1.HashMap 2.HashSet 3.TreeMap 4.TreeSet 5.LightWeightMap 6.LightWeightSet 7.P…

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2 1、 for i in range(5):Dev.step(9 - i * 2)Dev.turnLeft()2、 for i in range(3):Spaceship.step(i 1)Spaceship.turnRight()Spaceship.step(i 1)Spaceship.turnLeft()3、 for i in range(4):Dev.step(10 - i…

对象复制工具Orika,快速实现两个java对象的属性赋值

一、maven依赖引入orika <dependency><groupId>ma.glasnost.orika</groupId><artifactId>orika-core</artifactId><version>1.5.4</version></dependency>二、Orika工具类 import io.swagger.annotations.ApiModel; import io…

1707jsp电影视频网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 校园商城派送系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数…

3d粒子系统可以做什么模型?---模大狮模型网

在3D建模与动画领域&#xff0c;粒子系统是一种强大的工具&#xff0c;能够模拟出各种粒子效果&#xff0c;如火焰、水流、烟雾等&#xff0c;为场景增添了生动与真实感。然而&#xff0c;除了这些传统的应用外&#xff0c;3D粒子系统还有许多其他令人惊叹的用途。在本文中&…

Bert 实现情感分析任务

BERT Bert &#xff08;Bidirectional Encoder Representations from Transformers&#xff09;预训练模型是 Google 2018开源的自然语言模型&#xff0c;主要有以下特点。 像它名字一样&#xff0c;BERT最显著的特点是其能够为文本中的每个标记考虑双向上下文。与传统的基于…