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

news2025/4/13 15:24:43

系列文章目录

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

💕个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析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是mutable

    return 0;
}

 总结

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

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

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

相关文章

野火霸道-V2+3.2寸屏+FreeRTOS+LVGL移植

摘要 基于野火霸道-V23.2寸屏的开发板&#xff0c;下载器为STLINK分为两个版本&#xff0c;FreeRTOS和裸机版本 裸机 裸机准备 lvgl v8.2版本的源码野火的《触摸画板-3.2寸》与《基本定时器》的代码例程 移植 将基本定时器代码移植到触摸画板-3.2寸的例程中&#xff0c;…

java springboot将接口查询数据放在系统中 一小时系统更新一次 避免用户访问接口查询数据库缓慢

真到了公司 很多数据库表 特别是常用的功能业务对应的 都是几百万条起步的数据 查询会比较缓慢 那么 我们就可以不用每次都真的查询数据库 例如 我这里有一个接口 通过 封装的 IBookService.list 函数去查询数据库 接口返回是这样的 我们先在启动类 条件装配上 这个接口所在的…

MySQL所有常见问题

一、事务 定义:一组操作要么全部成功,要么全部失败,目的是为了保证数据最终的一致性 在MySQL中,提供了一系列事务相关的命令: start transaction | begin | begin work:开启一个事务commit:提交一个事务rollback:回滚一个事务事务的ACID 原子性(Atomicity):当前事…

信号与线性系统翻转课堂笔记20——系统函数与信号流图

信号与线性系统翻转课堂笔记20——系统函数与信号流图 The Flipped Classroom20 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff09;了解信…

CSU计算机学院2021年C语言期末题目思路分享(后两道题)

文章目录 E: 实数相加——大数加法的拓展原题题目描述输入输出样例输入样例输出 题目思路实现步骤代码和注释 F: 谍影寻踪——链表的思想和运用原题题目描述输入输出样例输入样例输出 题目思路 一点感想 E: 实数相加——大数加法的拓展 原题 题目描述 C语言就要期末考试了&a…

每日一题——LeetCode922

方法一 双指针&#xff1a; 一个偶指针一个奇指针&#xff0c;偶指针每次都指向nums里的偶数&#xff0c;奇指针每次指向nums里的奇数&#xff0c;两个指针交替push进新数组即可&#xff1a; var sortArrayByParityII function(nums) {var even0,odd0,res[],flagtruewhile(r…

C#,入门教程(02)—— Visual Studio 2022开发环境搭建图文教程

如果这是您阅读的本专栏的第一篇博文&#xff0c;建议先阅读如何安装Visual Studio 2022。 C#&#xff0c;入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程https://blog.csdn.net/beijinghorn/article/details/123350910 一、简单准备 开始学习、编写程序…

面试官:了解CountDownLatch吗

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

多线程编程设计模式(单例,阻塞队列,定时器,线程池)

&#x1f495;"只有首先看到事情的可能性&#xff0c;才会有发生的机会。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;多线程编程设计模式(单例,阻塞队列,定时器,线程池) 本文主要讲解多线程编程中常用到的设计模式,包括单例模式,阻塞队列,定时…

12.30序列检测(重叠、不重叠、连续、不连续、含无关项)——移位寄存器,状态机;状态机(二段式,三段式)

状态机-重叠序列检测 timescale 1ns/1nsmodule sequence_test2(input wire clk ,input wire rst ,input wire data ,output reg flag ); //*************code***********//parameter S00, S11, S22, S33, S44;reg [2:0] state, nstate;always(posedge clk or negedge rst) b…

仓储革新:AR技术引领物流进入智慧时代

根据《2022年中国物流行业研究&#xff1a;深度探析行业现状&#xff08;智能设备及智能软件&#xff09;》&#xff0c;报告中提及&#xff1a;“中国社会物流总额依然保持着较为良好的增长态势&#xff0c;年增速已恢复至常年平均水平。2021年社会物流总额细分中工业物流总额…

机器视觉实战应用:手势、人脸、动作以及手势鼠标构建(一)

CV实战应用手势、人脸、动作以及手势鼠标构建&#xff08;一&#xff09;总起 核心思想 手势识别是一种常见的计算机视觉应用&#xff0c;它可以通过摄像头或者预先录制的视频图像来追踪和识别人类手势。手势识别的应用非常广泛&#xff0c;例如在游戏、虚拟现实、人机交互等…

ActiveMQ漏洞合集

目录 介绍CVE-2015-5254&#xff1a;Apache ActiveMQ任意代码执行漏洞漏洞介绍 & 环境准备漏洞发现Nuclei❌Vulmap✅漏洞验证漏洞利用 CVE-2016-3088&#xff1a;Apache ActiveMQ Fileserver远程代码执行漏洞漏洞发现Nuclei✅Vulmap✅MSF✅第三方工具1&#xff08;漏洞探测…

谷歌Linux内核自动测试平台架构介绍-用自动测试测试难以测试的问题

1 摘要 内核和硬件等低级系统已被证明极难进行有效测试&#xff0c;因此&#xff0c;许多内核测试都是以手动为主方式进行的。现有的大多数测试框架都是为测试与底层平台隔离的高级软件而设计的&#xff0c;而底层平台被假定是稳定可靠的。测试底层平台本身需要一套全新的假设…

单字符检测模型charnet使用方法,极简

Git链接 安装按照上面的说明&#xff0c;说下使用。 把tools下面的test做了一点修改&#xff0c;可以读取一张图片&#xff0c;把里面的单个字符都检测和识别出来。 然后绘制到屏幕上。 import torch from charnet.modeling.model import CharNet import cv2, os import num…

第5课 使用openCV捕获摄像头并实现预览功能

这节课我们开始利用ffmpeg和opencv来实现一个rtmp推流端。推流端的最基本功能其实就两个:预览画面并将画面和声音合并后推送到rtmp服务器。 一、FFmpeg API 推流的一般过程 1.引入ffmpeg库&#xff1a;在代码中引入ffmpeg库&#xff0c;以便使用其提供的功能。 2.捕获摄像头…

“C语言与人生:手把手教你玩转C语言数组,从此编程无难题“

各位少年&#xff0c;我是博主那一脸阳光&#xff0c;由我来给大家介绍C语言的数组的详解。 在C语言中&#xff0c;数组是一种极其重要的数据结构&#xff0c;它允许我们存储和管理相同类型的一系列相关数据。通过理解并熟练掌握数组的使用&#xff0c;开发者能够高效地处理大量…

【Spark精讲】一文搞懂Spark钨丝Tungsten

Tungsten 内存管理机制 催生 Tungsten 内存管理优化的原因主要来自两个方面 。 • Java对象占用内存空间大。 相对于 C/C等更加底层的程序语言&#xff0c; Java对象的存储密度相对偏低。 例如&#xff0c;即使最简单的 “abed” 字符串&#xff0c;用Java的UTF-16编码的情况…

ssm基于web 的个人时间管理系统+vue论文

基于web 的个人时间管理系统的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的个人时间信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人…

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

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