【深度解析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.hqwc.cn/news/311676.html

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

相关文章

特殊权限(suid sticky acl mask)

1.suid 1. 普通用户可不可以修改密码&#xff1f; 答&#xff1a;是可以的&#xff0c;可以修改自己的密码 2. /etc/shadow 文件的作用是什么&#xff1f; 答&#xff1a;存储用户密码的文件 3. 普通用户是否可以修改/etc/shadow 文件&#xff1f; 答&#xff1a;不可以&…

CSDN - 从CSDN下载自己上传的资源要下载码, 自己无法下载

从CSDN下载自己上传的资源要下载码, 自己无法下载 概述 程序里面要用一个参数文件的加解密类, 想到自己以前上传到csdn有demo. 就去下载自己上传的demo. 无法下载, 需要下载码. 也不知道这下载码怎么获得? 按照提示去关注CSDN官方的号, 关注了之后没啥反应, 应该是以前关注过…

java中PhantomReference WeakReference SoftReference垃圾回收触发时机以及使用场景

目录 强引用 垃圾回收触发时机 使用场景 SoftReference&#xff08;软引用&#xff09; 垃圾回收触发时机 使用场景 WeakReference &#xff08;弱引用&#xff09; 垃圾回收触发时机 使用场景 PhantomReference &#xff08;虚引用、幽灵引用&#xff09; 垃圾回收…

2023-12-22 LeetCode每日一题(得到山形数组的最少删除次数)

2023-12-22每日一题 一、题目编号 1671. 得到山形数组的最少删除次数二、题目链接 点击跳转到题目位置 三、题目描述 我们定义 arr 是 山形数组 当且仅当它满足&#xff1a; arr.length > 3存在某个下标 i &#xff08;从 0 开始&#xff09; 满足 0 < i < arr.…

arkts中@Watch监听的使用

概述 Watch用于监听状态变量的变化&#xff0c;当状态变量变化时&#xff0c;Watch的回调方法将被调用。Watch在ArkUI框架内部判断数值有无更新使用的是严格相等&#xff08;&#xff09;&#xff0c;遵循严格相等规范。当在严格相等为false的情况下&#xff0c;就会触发Watch的…

软件开发新手用哪个IDE比较好?软件开发最好的IDE都在这!

目录 IDES 的优点 最佳编程 IDE 列表 Java 开发的流行集成开发环境 JetBrains 的 IntelliJ IDEA NetBeans 适用于 C/ C、C# 编程语言的最佳 IDE Visual Studio 和 Visual Studio 代码 Eclipse PHP 开发的最佳 IDE PHPStorm Sublime Text Atom JavaScript 的顶级 I…

2024年,程序员有哪些危机,有什么应对方式?

在2024年&#xff0c;程序员可能面临的危机主要包括技术更新迅速、职业竞争激烈、工作与生活平衡困难等方面。 为了应对这些危机&#xff0c;程序员可以采取以下策略&#xff1a; 技术更新迅速&#xff1a;随着技术的不断发展&#xff0c;新的编程语言和工具不断涌现&#xff…

大模型请回答2023 :A股能否突破3000点,贾跃亭何时回国?

2023年&#xff0c;国内最少已经有238个公开大模型。 但要回答关于2023年的问题&#xff0c;238个大模型还远远不够。 2023年&#xff0c;站在一个共识被打碎的十字路口。文明的黄金时代逐渐落幕&#xff0c;增长不再是全球经济的理所当然&#xff0c;每一个行业的都面临着新…

研究:同样的C++模板在多个cpp里出现,编译器是否要重复生成?

2023年就要过去&#xff0c;马上要跨如2024年。祝大家在新的一年&#xff0c;有个好收成。 一直以来不是很确定&#xff1a; 同样的的模板&#xff0c;在各个cpp分别出现&#xff0c;编译器要实现几份&#xff1f; 研究一下。 用命令行的编译方法&#xff0c;参考&#xff1a…

认识计算机网络——计算机网络的组成

计算机网络是由多个计算机和网络设备组成的系统&#xff0c;通过通信协议实现数据传输和信息交换。它是现代社会信息技术的重要支撑&#xff0c;广泛应用于各个领域。本文将介绍计算机网络的主要组成部分&#xff0c;包括硬件设备、软件协议和网络服务。 一、硬件设备 计算机网…

二维动态规划问题,python解决最长回文子串

一个算法中的经典问题&#xff0c;求最长回文子串问题&#xff0c;其实是可以归于二维动态规划问题。 对于给定的一个字符串中&#xff0c;找到这个字符串中的回文子串&#xff0c;回文子串的概念是从前往后正向的读和从后往前反向的读都是完全相同的字符串。 对这个问题进行…

kivy中用anchrolayout

说明 AnchorLayout 是 Kivy 框架中用于管理界面元素位置的一种布局方式。AnchorLayout 的特点是&#xff0c;它可以将其子元素锚定到布局的边界上&#xff0c;例如顶部、底部、左侧或右侧。这使得在需要元素相对于其容器边界保持固定位置时非常有用。 界面 # mylayout.kvAnch…