【深度解析C++】const成员函数

系列文章目录

🌈座右铭🌈:人的一生这么长、你凭什么用短短的几年去衡量自己的一生!

💕个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C++,自顶向下看Java-CSDN博客

❤️相关文章❤️:C++this指针:【深度解析C++之this指针】-CSDN博客文章浏览阅读797次,点赞21次,收藏22次。一、为什么需要this指针this指针是C++当中用于指向当前对象的指针,它是成员函数内的一个隐式参数,指向调用该成员函数的对象的内存地址(this指针存放的内容就是对象的内存地址),this指针的主要用途是在成员函数内部访问对象的成员变量和调用其他的成员函数。在类的成员函数当中,如果存在与类的成员变量同名的局部变量或者函数参数,编译器可能无法区分它们,这个时候我们就需要使用this指针可以明确地指出成员变量属于当前对象。https://blog.csdn.net/weixin_59658448/article/details/135136967


目录

系列文章目录

文章目录

前言

一、const成员函数是什么?

1、const成员函数的声明

2、const成员函数的定义

3、const成员函数的特点

        1、不能修改成员变量

        2、只能调用const成员函数

 二、const对象与const成员函数

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

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

3、const成员函数内可以调用其他非const成员函数吗?

4、非const成员函数内可以调用其他const成员函数吗?

5、总结

三、mutable关键字

1、基本概念

2、使用场景

3、注意事项

 总结


前言

        这篇文章是C++类和对象章节的最后一个知识点,我会结合C++this指针为大家讲解关于C++const成员函数的相关知识以及细节,欢迎大家订阅我的《深度解析C++专栏》能够帮助到大家就是对我最大的鼓励。我会为大家持续输出优质文章。


一、const成员函数是什么?

        在C++中,const成员函数是指在函数声明或定义中使用关键字const修饰的成员函数。这意味着该函数承诺不会修改调用它的对象的成员变量。接下来我为大家详细解释一下。

1、const成员函数的声明

class MyClass {
public:void regularFunction();void constFunction() const;
};

        在上面的例子中,constFunction 是一个const成员函数。

2、const成员函数的定义

void MyClass::constFunction() const {// 在这里只能访问对象的成员变量,但不能修改它们// 任何尝试修改成员变量的操作都会导致编译错误
}

3、const成员函数的特点

        1、不能修改成员变量

        在const成员函数中,任何试图修改对象的成员变量的操作都会导致编译错误。这是因为const成员函数语法规定不会修改对象的状态。

        2、只能调用const成员函数

        如果你有一个const对象,你只能调用它的const成员函数。这是因为const对象不允许调用非const成员函数,以防止修改对象的状态。

const MyClass obj;
obj.constFunction(); // 合法
obj.regularFunction(); // 编译错误,因为 regularFunction 不是 const 成员函数

        使用const成员函数的主要目的是为了增强代码的可读性和安全性。通过使用const关键字,我们可以明确表示一个函数不会修改对象的状态,而且编译器也可以进行更严格的检查。


 二、const对象与const成员函数

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

        不可以。const对象只能调用const成员函数。调用非const成员函数将导致编译错误,因为这违反了const对象的特性,即不允许修改对象的状态。

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

        是的,非const对象可以调用const成员函数。这是因为const成员函数承诺不会修改对象的状态,所以即使是非const对象调用,也不会导致编译错误。

3、const成员函数内可以调用其他非const成员函数吗?

        是的,const成员函数内可以调用其他非const成员函数。因为const成员函数本身不修改对象的状态,而调用非const成员函数的行为并不违反这个承诺。

4、非const成员函数内可以调用其他const成员函数吗?

        是的,非const成员函数内可以调用其他const成员函数。非const成员函数可以修改对象的状态,但它也可以调用不修改状态的const成员函数。这是因为调用const成员函数不会导致破坏对象的const属性。

5、总结

        针对前两个问题为什么const对象只能调用const成员函数呢?因为const成员函数当中的const是用来修饰this指针的,这也就意味着this指针是const类型的,这也就意味着this指针指向的内容不可以发生变化,我们要知道this指针是什么?是一个对象的地址呀!换言之这个this指针指向的内容不可以发生变化也就是这个对象的各种属性都不可以发生变化。

        而对象调用函数的时候编译器会自动地讲这个对象的地址赋值给非静态成员函数的第一个隐式参数,我们认真思考一下,一个非const对象的指针能够赋值给const类型的指针吗?显然是不可以的,非const类型的变量不允许赋值给const类型的变量。这就是为什么只有const对象才能调用const成员函数。这部分的内容涉及到this指针的基本概念,大家如果有不理解的地方可以去看我之前的文章。


三、mutable关键字

        在C++中,mutable关键字用于修饰类的成员变量,允许在const成员函数中修改被mutable修饰的成员变量。这提供了一种例外,允许在const对象上调用const成员函数时修改某些特定的成员变量,而不违反const成员函数的原则。

1、基本概念

class MyClass {
public:mutable int counter;  // 使用mutable关键字修饰的成员变量void constFunction() const {// 在const成员函数中修改被mutable修饰的成员变量counter++;}
};

2、使用场景

  • 缓存变量的更新: 如果某个成员变量在逻辑上是可以被视为不改变对象状态的,但是为了优化或其他目的,在const成员函数中需要更新,可以使用mutable关键字。

  • 日志记录: 在const成员函数中记录日志的计数或状态信息,而不影响对象的逻辑状态。
    这部分内容的理解还需要我们以后遇到项目的时候具体场景去解决,这篇文章的这部分内容大家理解就好,只需要记住这个关键字是干什么的就行。

3、注意事项

  • mutable关键字只能用于类的非静态成员变量。(因为这个操作没有任何意义,静态成员是属于类的,而成员函数是属于对象的二者不是一个层次的,这样做没有任何意义)

  • 虽然使用mutable允许在const成员函数中修改成员变量,但应该小心确保修改不会导致逻辑错误。

  • 需要慎重使用mutable,因为它破坏了const成员函数的"不修改对象状态"的原则,应该仅在有明确合理的理由时使用。

#include <iostream>class MyClass {
public:mutable int counter;void constFunction() const {counter++;std::cout << "Counter in constFunction: " << counter << std::endl;}
};int main() {const MyClass obj;obj.constFunction();  // 合法,因为counter是mutablereturn 0;
}

 总结

        const成员函数的主要知识点就为大家全部介绍完毕,C++类和对象的基础知识部分我也全部为大家讲解完成,我用心经营的《深度解析C++》栏目的类和对象专题也到此结束,而此时此刻2023年也终于接近了尾声,这一年太长这一年也太短,这一年的收获很多,虽然辛苦但都是值得的,之后让我们一起迎接崭新的2024。东方欲晓、莫道君行早、踏遍青山人未老、风景这边独好!诸君共勉!

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

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

相关文章

Kafka_01_Kafka初识

Kafka_01_Kafka初识 Kafka基础概念延迟任务 Kafka Kafka: ZooKeeper协调的分布式消息系统 基于Scala语言编写的高性能、多分区、多副本Kafka高性能的原因&#xff1a;页缓存、顺序IO、零拷贝 具有以下特性&#xff1a; 消息中间件: 系统解耦、冗余存储、流量消峰、异步通信…

C++的面向对象学习(7):面向对象编程的三大特性之:继承

文章目录 前言一、继承&#xff1a;继承的类除了拥有上一级类的共性&#xff0c;也拥有自己的特性。二、继承方式&#xff1a;公有继承&#xff08;public inheritance&#xff09;、私有继承&#xff08;private inheritance&#xff09;和保护继承&#xff08;protected inhe…

C练习——爱因斯坦台阶问题(穷举法)

题目&#xff1a;爱因斯坦曾经提出过这样一道有趣的数学题&#xff1a;有一个长阶梯&#xff0c;若每步上2阶&#xff0c;最后剩下1阶&#xff1b;若每步上3阶&#xff0c;最后剩2阶&#xff1b;若每步上5阶&#xff0c;最后剩下4阶&#xff1b;若每步上6阶&#xff0c;最后剩5…

排序算法讲解

1&#xff09;排序思想&#xff1a; 2&#xff09;排序代码&#xff1a; 3&#xff09;注意点&#xff1a; 4&#xff09;时间/空间复杂度和稳定性 下面的排序是以实现升序讲解的。 &#xff08;一&#xff09;直接插入排序 1&#xff09;排序思想&#xff1a; 把待排序的…

Java注解学习,一文掌握@Autowired 和 @Resource 注解区别

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Python教程(19)——python异常处理

异常处理 什么是异常异常处理方式try-except语句捕获异常类型 相关的异常类型 什么是异常 在计算机编程中&#xff0c;异常&#xff08;Exception&#xff09;是指在程序执行过程中发生的错误或异常情况。当出现异常时&#xff0c;程序无法正常继续执行&#xff0c;因此需要采…

【Java进阶篇】SimpleDateFormat是线程安全的吗? 使用时应该注意什么?

SimpleDateFormat是线程安全的吗?使用时应该注意什么? ✔️ 典型解析✔️拓展知识仓✔️SimpleDateFormat用法✔️日期和时间模式表达方法✔️输出不同时区的时间✔️SimpleDateFormat线程安全性✔️问题重现✔️线程不安全原因✔️如何解决✔️使用局部变量✔️加同步锁✔️…

Java Log 学习笔记

参考文章&#xff1a; 1.Java 日志从入门到实战 2.Java日志框架的发展历史&#xff0c;你不想了解一下吗 背景 想自定义 logback 配置文件进行日志分级别记录到不同文件&#xff0c;遇到了几个问题&#xff08;使用的是 spring-boot 构建的项目&#xff0c;spring-boot 版本为…

深度学习从入门到不想放弃-5

看了一眼这个文章系列,居然第四集是11月5号写的,这25天可见发生了多少事情... 今天我们讲讲特征,算是基础篇的一个番外篇延伸,我省着在后面的文章里写了,怕扰乱了思路 严格来说这个属于基础机器学习领域里的了,我又不讲决策树,贝叶斯,隐马尔可夫啥的(不在这个系列写,…

OPenGL GLSL

shji 数据类型 整型&#xff08;有符号/无符号&#xff09; 浮点数&#xff08;单精度&#xff09; 布尔值 向量类型/矩阵类型 bool bDone false int value 1; unint vale 21u float value 2.1 向量/分量类型 vec2,vec3,vec4 2分量 3 分量 4 分量复电向量 i…

机器学习---随机森林宫颈癌分类

1. 宫颈癌分类 from sklearn import tree from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.model_selection import GridSearchCV from sklearn.pipeline import Pipeline from sklearn.preprocessi…

VistualStudio查看类图UML

点击菜单栏中的工具–》获取工具和功能。 然后在资源管理器中对应的代码中鼠标右键选择查看类图 生成一个ClassDiagram.cd文件就是类图的文件了。 根据需要拖拽就可以生成类图了。

常用的 MySQL 可视化客户端

数据库可视化客户端&#xff08;GUI&#xff09;让用户在和数据库进行交互时&#xff0c;能直观地查看、创建和修改对象&#xff0c;如&#xff1a;表、行和列。让数据库操作变得更方便了。 今天&#xff0c;我们来了解下目前市场上最常用的 MySQL 可视化客户端。 官方&#x…

数据结构期末复习(2)链表

链表 链表&#xff08;Linked List&#xff09;是一种常见的数据结构&#xff0c;用于存储一系列具有相同类型的元素。链表由节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两部分&#xff1a;数据域&#xff08;存储元素值&#xff09;和指针域&#xff08;指…

vscode配置的C++环境

目录 1、下载并安装VScode 2、下载MinGW 3、配置MinGW 3.1添加环境变量 3.2 Vscode配置 3.3测试 1、下载并安装VScode Visual Studio Code - Code Editing. Redefined 2、下载MinGW 在MinGW官网MinGW-w64 - for 32 and 64 bit Windows - Browse /mingw-w64/mingw-w64-r…

List集合格式转换

最近遇到一个任务&#xff1a; 需要把A集合数据转成 B集合的形式&#xff1a; A集合&#xff1a; B集合&#xff1a; 代码&#xff1a; package com.example.juc.test;import com.example.juc.entity.Ld; import com.example.juc.entity.Student;import java.lang.reflect.F…

【Petalinux】制作SD卡 操作系统 启动

Vivado 添加 SD0 导出hdf 制作SD卡 https://mathd.blog.csdn.net/article/details/135217761 【Petalinux】下为空白SD卡建立BOOT&#xff0c;rootfs分区 Petalinux 生成 Petalinux 框架 petalinux-create --type project --template zynq --name sdtest进入 sdtest 文件…

Ksher H5页面支付实例指导 (PHP实现)

前文 背景介绍 前两天&#xff0c;公司的项目&#xff0c;为了满足泰国客户的支付需求&#xff0c;要求使用 Ksher (开时支付) 对接任务突然就给了鄙人&#xff0c;一脸懵 … 通过了解客户的使用场景、以及参考官网指导 发现&#xff1a;Ksher支付 最令人满意的便是 —— 提供了…

【网络安全/CTF】easyphp 江苏工匠杯

本题考察PHP语言相关绕过知识 正文 开门见山给代码 <?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),…

【Java】如何给你的图片添加自定义水印(附完整代码)?

这是一篇关于怎么尽可能的用尽你电脑里的所有字体给你的图片加水印。。。。 先上效果~ 当然这只是其中一部分字体&#xff0c;&#xff0c;&#xff0c;我也是今天才发现我电脑里居然装了那么多字体 好了废话不多说直接上完整代码~ import io.swagger.models.auth.In;import …