【C++ | const成员】一文了解类的 const数据成员、const成员函数、const对象、mutable 数据成员

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:2024-06-14 23:57:00

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、const 数据成员
  • 🎄三、const 成员函数
  • 🎄四、mutable 数据成员
  • 🎄五、const 对象
  • 🎄六、总结



在这里插入图片描述

🎄一、概述

在C++中,const 关键字可以用来定义常量,并且const修饰的对象是必须初始化且不能被修改的。

在C++的类和对象中,使用const也有一些需要注意的:
1、对于类的const数据成员,要怎样初始化呢?
2、类的const函数是怎样的?有什么用处?怎样定义const函数?
3、使用const对象有哪些需要注意的?


在这里插入图片描述

🎄二、const 数据成员

const 数据成员:是指在类中声明的,使用 const 关键字修饰的数据成员。下面代码的Month就是 const 数据成员:

class CDate
{
...
private:int m_year;int m_mon;int m_day;const int Month;
};

const 修饰的对象必须要初始化,那么类的 const 数据成员怎样初始化呢?C++提供了两种方法:

  • 1、构造函数的成员初始化列表:
    成员初始化列表只有构造函数才有,在参数列表后使用分号(:)分隔开,下面以 CDate 为例,其构造函数如下;

    CDate(int year, int mon, int day):Month(12)
    {m_year = year;m_mon = mon;m_day = day;
    }
    
  • 2、C++11的类内初始化:
    C++11标准支持类内初始化,就是在类中声明数据成员的时候就初始化。参考下面代码:

    class CDate
    {
    ...
    private:int m_year;int m_mon;int m_day;const int Month=12;	// C++11的类内初始化
    };
    

下面代码演示了上面两中方法:

// // g++ 16_member_init_list.cpp -std=c++11
#include <iostream>
using namespace std;class CDate
{
public:
#if __cplusplus > 199711L // C++11CDate(int year, int mon, int day)
#elseCDate(int year, int mon, int day):Month(12)
#endif{m_year = year;m_mon = mon;m_day = day;}void show(){cout << "Date: " << m_year << "." << m_mon << "." << m_day << ", Month=" << Month << endl;}private:int m_year;int m_mon;int m_day;
#if __cplusplus > 199711L // C++11const int Month = 12; // C++11的类内初始化
#elseconst int Month;
#endif
};int main()
{cout << __cplusplus << endl; // 打印 C++标准CDate date(2024,06,14);date.show();return 0;
}

在这里插入图片描述

🎄三、const 成员函数

const 成员函数:是指保证不会修改调用对象的成员函数。

const 成员函数在函数声明和定义时,会在函数参数的括号后面添加关键字 const,以 CDate 类为例:

void show() const; // 声明
void CDate::show() const // 声明
{// m_year = 1;	// 会报错:assignment of member ‘CDate::m_year’ in read-only objectcout << "Date: " << m_year << "." << m_mon << "." << m_day << ", Month=" << Month << endl;
}

const 成员函数的几个注意点:

  • 1、const 成员函数本质上是修改了this指针的类型,改为 const 类类型 *this
  • 2、只要类方法不修改调用对象, 就应将其声明为 const。
  • 3、const 成员函数不能修改数据成员,除非该数据成员是 mutable 修饰的。
  • 4、const函数只能调用const函数,不能调用非const函数
  • 5、const 成员函数如果以引用的形式返回*this,那么它的返回类型将是const引用。
  • 6、基于 const 的函数重载,通过区分成员函数是否为 const 的,可以对该函数进行重载。因为const成员函数的this指针是const的,而非const成员函数的this指针没带const。
  • 67、构造函数不能声明、定义为const。

在这里插入图片描述

🎄四、mutable 数据成员

mutable 数据成员:是指在类中声明的,使用 mutable 关键字修饰的数据成员。永远不会是 const,即使它是 const 对象的成员。也就是说, mutable 数据成员在任何成员函数中都可以被更改。

下面例子演示了怎样声明、定义、使用 const 成员函数mutable 数据成员

// g++ 16_const_fun.cpp 
#include <iostream>
using namespace std;class CDate
{
public:CDate(int year, int mon, int day):Month(12){m_year = year;m_mon = mon;m_day = day;mu_Month = 0;}void show() const;private:int m_year;int m_mon;int m_day;const int Month;mutable int mu_Month;
};void CDate::show() const
{mu_Month = 1;	// mutable 数据成员在任何成员函数中都可以被修改cout << "Date: " << m_year << "." << m_mon << "." << m_day << ", mu_Month=" << mu_Month << endl;
}int main()
{CDate date(2024,06,14);date.show();return 0;
}

在这里插入图片描述

🎄五、const 对象

const 对象:使用关键字 const 修饰并创建的对象是 const 对象。

关于const对象有几个注意点:
1、const对象 需要初始化,除非提供无参构造;
2、const对象 只能调用 const函数
3、非const对象 优先调用 非const函数 ,如果没有 非const函数 则选择 const函数

参照下面例子:

// g++ 16_const_object.cpp 
#include <iostream>
using namespace std;class CDate
{
public:CDate(int year, int mon, int day){m_year = year;m_mon = mon;m_day = day;}CDate(){}	// 1、const 对象必须初始化,除非提供无参构造void show(){cout << "Date: " << m_year << "." << m_mon << "." << m_day << ", not const" << endl;}void show() const{cout << "Date: " << m_year << "." << m_mon << "." << m_day << ", const" << endl;}private:int m_year;int m_mon;int m_day;
};int main()
{const CDate date;date.show();return 0;
}

在这里插入图片描述

🎄六、总结

👉本文介绍了类的 const数据成员、const成员函数、mutable 数据成员、const对象

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

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

相关文章

新一代大核卷积反超ViT和ConvNet!同参数量下性能、精度、速度完胜

大核卷积网络是CNN的一种变体&#xff0c;也是深度学习领域的一种重要技术&#xff0c;它使用较大的卷积核来处理图像数据&#xff0c;以提高模型对视觉信息的理解和处理能力。 这种类型的网络能够捕捉到更多的空间信息&#xff0c;因为它的大步长和大感受野可以一次性覆盖图像…

运维监控系统

做监控系统集成&#xff0c;持续更新ing 1.Prometheus k8s安装prometheusdocker部署prometheusthanos实现prometheus高可用部署 2.Grafana docker安装grafanagrafana的admin密码忘记了grafana使用mysql远程存储 3.Alertmanager 4.Consul 5.夜莺系统 6.时序数据库 6.1 …

C++语法08 数据类型之间的强制转换

目录 强制类型转换 强制类型转换格式 整型转换成浮点型 整型转换成浮点型其他写法 训练&#xff1a;糖果奖励 糖果奖励参考代码 浮点型转换成整型 浮点型转换成整型其他写法 训练&#xff1a;分离小数 分离小数参考代码 强制类型转换 强制类型转换&#xff0c;就是把…

如何应对生活中的不确定性:仁者安仁,知者利仁。

有较高自尊水平的人&#xff0c;接近于孔子说的&#xff1a;仁者。 ——— 有着稳定的高自尊&#xff0c;无论外在环境如何变化&#xff0c;对其影响都不大&#xff0c;他能够愉快地生活。 相反&#xff1a;一个人处于低自尊状态&#xff0c;就会活得很痛苦&#xff0c;对自己…

Nginx之HTTP模块详解

Nginx是模块化的代码架构&#xff0c;其代码由核心代码与功能模块代码构成。Nginx的主要功能模块是HTTP功能模块&#xff0c;HTTP功能模块在HTTP核心功能的基础上为Nginx对HTTP请求的处理流程提供了扩展功能&#xff0c;这些扩展功能可以让用户很方便地应对访问控制、数据处理、…

基于MCU平台的HMI开发的性能优化与实战(上)

随着汽车座舱智能化的不断演进&#xff0c;车内显示设备的数量显著增加&#xff0c;从传统的仪表盘和中控屏扩展至空调控制、扶手、副驾驶区域以及抬头显示&#xff08;HUD&#xff09;等多样化的显示单元。为了有效支持这些功能单元&#xff0c;同时控制整车成本&#xff0c;越…

java值jsp语法笔记

1 JSP注释 1.1 显示注释 显示注释会出现在生成的HTML文档中&#xff0c;对用户可见。 <!-- 这是一个HTML显示注释 --> 1.2 隐式注释 隐式注释不会出现在生成的HTML文档中&#xff0c;对用户不可见。 <%-- 这是一个JSP隐式注释 --%> 2 JSP脚本元素 2.1 局部…

手机在网状态-手机在网状态查询-手机在网站状态接口

查询手机号在网状态&#xff0c;返回正常使用、停机、未启用/在网但不可用、不在网&#xff08;销号/未启用/异常&#xff09;、预销户等多种状态 直连三大运营商&#xff0c;实时更新&#xff0c;可查询实时在网状态 高准确率-实时更新&#xff0c;准确率99.99% 接口地址&…

54.Python-web框架-Django-免费模板django-datta-able

1.Datta Able Django介绍 Detta Able Djiango是什么 Datta Able Django 是一个由AppSeed提供的开源Django管理面板&#xff0c;基于现代设计&#xff0c;为开发者提供了一流的功能和优雅的界面。它源自CodedThemes的高风格化Bootstrap 4模板——Datta Able Bootstrap Lite&…

python-基础篇-文件和异常

文章目录 文件和异常读写文本文件读写二进制文件读写JSON文件 文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#…

什么是快乐?

什么是快乐&#xff1f; What is Happiness? 1. 快乐不是追求外在的物质&#xff0c;而是内心的平静与满足。当我们学会感恩&#xff0c;懂得珍惜眼前的一切&#xff0c;心中自然会充满喜悦。快乐并非来自拥有更多&#xff0c;而是感受到已经拥有的足够。每一天都怀抱感激之情…

雅思阅读阅读技巧建议

同桌雅思网站&#xff1a; https://ielts2.itongzhuo.com/business/ielts/student/jumpIeltsQuestionList.do?sSubjects10&typeundefined 雅思阅读三步走&#xff08;up:charlie有好好学习&#xff09; 第一步&#xff1a;预读题目并画出关键词 做题顺序 顺序题&#xff…

使用dockerfile能力构建制品并打包容器

以常见的vue项目为例&#xff0c;使用如下Dockerfile # 第一阶段&#xff1a;构建应用 FROM node:18.18.1 AS builder WORKDIR /app # 复制package.json和package-lock.json到容器中&#xff08;如果需要&#xff09; COPY package*.json ./ # 安装依赖 RUN npm install # 复制…

Spark 面试题(十)

1. 简述Spark参数&#xff08;性能&#xff09;调优 &#xff1f; Spark性能调优涉及多个方面&#xff0c;包括资源分配、任务并行度、内存管理、存储策略等。以下是一些关键的Spark性能调优参数&#xff1a; spark.executor.memory&#xff1a;设置Executor的内存大小。这是最…

qt如何在linux平台上设置编译生成windows程序文件,跨平台?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「qt的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;QT本来目标就是跨平台&#xf…

Commons-Collections篇-CC4链分析

前言 因为 CommonsCollections4 除 4.0 的其他版本去掉了 InvokerTransformer 继承 Serializable&#xff0c;导致该方法无法序列化。 同时 CommonsCollections 4的版本 TransformingComparator 继承了 Serializable接口&#xff0c;而CommonsCollections 3里是没有的&#xf…

hrm人力管理系统源码(从招聘到薪酬的全过程人力管控系统)

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化人力资源管理系统&#xff0c;涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块&#xff0c;解决了从人事招聘到酬薪计算的全周期人力资源管理&#xff0c;符合当下大中小型企业组织架构管理运…

Stringboot

一、概述 springboot是spring家族中的一个全新框架&#xff0c;用来简化spring程序的创建和开发过程。在以往我们通过SpringMVCSpringMybatis框架进行开发的时候&#xff0c;我们需要配置web.xml&#xff0c;spring配置&#xff0c;mybatis配置&#xff0c;然后整合在一起&…

django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.33).

django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.33). 一、原因分析 在新版的Django默认需要MySQL 8或更高版本&#xff0c;才能运行。 二、解决办法 1、升级mysql数据库版本 只需要将mysql版本升级到8.0&#xff0c;即可解决&#xff0c;当然这…

yum方式更新Jenkins

目的 使用yum方式更新Jenkins。 步骤 查看最新可用版本 $ yum list jenkins Last metadata expiration check: 0:03:44 ago on Fri Jun 14 06:10:01 2024. Installed Packages jenkins.noarch 2.452.1-1.1 jenkins Available Pa…