【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/news/857060.shtml

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

相关文章

win10修改远程桌面端口号,在Windows 10中修改远程桌面端口号的步骤

在Windows 10中&#xff0c;远程桌面服务&#xff08;Remote Desktop Services, RDS&#xff09;允许用户从远程位置访问和操作计算机。默认情况下&#xff0c;远程桌面协议&#xff08;RDP&#xff09;使用端口3389进行通信。然而&#xff0c;出于安全考虑&#xff0c;管理员可…

VScode创建ROS项目 ROS集成开发环境

ROS使用VScode创建项目步骤 1.创建ROS工作空间2.启动VScode3.VScode编译ROS4.创建ROS功能包C语言开发Python语言开发 本文章介绍了如何在Ubuntu18.04系统下搭建VScode 的ROS项目 搭建项目分为一下几个步骤&#xff1a; 1.创建ROS工作空间 创建一个demo的ROS工作空间&#xff0…

大数据学习-Hadoop

介绍 是 Apache 的顶级开源项目&#xff0c;一个分布式框架&#xff0c;主要功能&#xff1a; 分布式大数据存储——HDFS 组件分布式大数据计算——MapReduce 组件分布式资源调度——YARN 组件 可以通过它来构建集群&#xff0c;完成大数据的存储和计算 学习起来相对简单&…

怎么看电脑实时充电功率

因为我想测试不同的充电器给电脑充电的速度&#xff0c;所以就想找一款软件可以看电脑当前充电功率的软件&#xff0c;我给一个图 直接搜索就可以下载了&#xff0c;charge rate就是功率&#xff0c;这里是毫瓦&#xff0c;换算单位是 1000mw1w 所以我这里充电功率是65w&…

6.21 移动语义与智能指针

//先构造&#xff0c;再拷贝构造//利用"hello"这个字符串创建了一个临时对象//并复制给了s3//这一步实际上new了两次String s3 "hello"; 背景需求&#xff1a; 这个隐式创建的字符串出了该行就直接销毁掉&#xff0c;效率比较低 可以让_pstr指向这个空间…

squareline studio浅尝(1)在对话框添加键盘

因项目需要&#xff0c;需要修改IP地址等参数&#xff0c;需要编辑文本对话框内容&#xff0c;这时候就需要调用键盘&#xff0c;操作如下。主要为了做笔记。如有误导请及时留言。 1&#xff09;拖一个键盘到对话框页面。默认把它隐藏&#xff08;flag:hidden&#xff09; 2&…

想更好应对突发网络与业务问题?您需要一款“全流量”

全流量分析&#xff0c;能为我做什么&#xff1f; 在生活中遇到问题&#xff0c;我们的第一反应可能是拿出手机拍照记录&#xff0c;方便后续处理。这些问题是临时的、突发的。 流量分析&#xff0c;就是网络中的“手机”&#xff0c;针对突发的网络故障和安全事件&#xff0…

课程管理系统

摘 要 在大学里&#xff0c;课程管理是一件非常重要的工作&#xff0c;教学工作人员每天都要与海量的数据和信息打交道。确保数据的精确度和完整程度&#xff0c;影响着每一位同学的学习、生活和各种活动的正常展开&#xff0c;更合理的信息管理也为高校工作的正规化运行和规范…

解锁空间数据奥秘:ArcGIS Pro与Python双剑合璧,处理表格数据、矢量数据、栅格数据、点云数据、GPS数据、多维数据以及遥感云平台数据等

ArcGISPro提供了用户友好的图形界面&#xff0c;适合初学者快速上手进行数据处理和分析。它拥有丰富的工具和功能&#xff0c;支持各种数据格式的处理和分析&#xff0c;适用于各种规模的数据处理任务。ArcGISPro在地理信息系统&#xff08;GIS&#xff09;领域拥有广泛的应用&…

安全生产第一位,靠谱的漏油监测系统有哪些?

漏油监测系统&#xff0c;一般是由漏油绳、漏油控制器、监控云平台组成&#xff0c;用于实时检测油库、油罐、加油站、输油管道、油类化工厂等场所是否发生漏油事故。在这些地方一旦发生漏油&#xff0c;就极可能引发爆炸&#xff0c;损害到人员及财产安全。而一套靠谱的漏油监…

mysql 主从延迟

mysql 主从延迟 精华推荐 | 【MySQL技术专题】「主从同步架构」全面详细透析MySQL的三种主从复制&#xff08;Replication&#xff09;机制的原理和实战开发&#xff08;原理实战&#xff09; https://blog.csdn.net/l569590478/article/details/128329929 mysql主从之多线程复…

iptables(6)扩展匹配条件--tcp-flags、icmp

简介 前面我们已经介绍了不少的扩展模块,例如multiport、iprange、string、time、connlimit模块,但是在tcp扩展模块中只介绍了tcp扩展模块中的”--sport”与--dport”选项,并没有介绍”--tcp-flags”选项,那么这篇文章,我们就来认识一下tcp扩展模块中的”--tcp-flags”和i…

【MySQL进阶之路 | 高级篇】InnoDB搜索引擎行格式

1. COMPACT行格式 COMPACT行格式是MySQL5.1的默认行格式.其结构示意图如下. 大体可以分为两部分. 记录的额外信息.这里面有包括变长字段长度列表&#xff0c;NULL值列表和记录头信息.记录的真实数据. (1).变长字段长度列表 MySQL支持一些变长的数据类型.比如VARCHAR(m), VA…

基于JSP技术的个性化影片推荐系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPServlet 工具&#xff1a;MyEclipse、Tomcat、MySQL 系统展示 首页 …

langchain教程-(1)Prompt模板

LangChain 的核心组件 模型 I/O 封装 LLMs&#xff1a;大语言模型Chat Models&#xff1a;一般基于 LLMs&#xff0c;但按对话结构重新封装PromptTemple&#xff1a;提示词模板OutputParser&#xff1a;解析输出 数据连接封装 Document Loaders&#xff1a;各种格式文件的加载…

Docker Desktop进入界面时一直转圈的解决办法记录

我的win10版本如下&#xff0c;是支持安装的&#xff0c;不支持安装的&#xff0c;可以先升级系统版本&#xff1a; 起初是因为运行Docker Desktop时一直转圈&#xff0c;无法进入主面板&#xff0c;百度之&#xff0c;需要安装hype-v环境&#xff0c;找到以下 勾选Hyper-V下的…

分享由AI制定一个商城网站的开发计划及推荐的开发语言

商城网站开发计划 一、项目概述 本商城网站开发计划旨在创建一个功能齐全、用户友好的在线购物平台&#xff0c;为顾客提供商品浏览、搜索、购物车管理、订单跟踪、在线支付等服务。商城将支持多种商品分类&#xff0c;包括但不限于电子产品、家居用品、服饰鞋帽等。 二、开…

在小公司可以做大模型吗?心得经验分享_第一份工作在小公司做大模型好吗

导读 继ChatGPT发布以来&#xff0c;各种大模型相继问世。近日Sora也突然走入大众的视野。那么做模型是否只有OpenAI这种巨头公司才能做呢&#xff0c;答案是否定的。在小公司做大模型&#xff0c;是可以的。本文作者结合切身经历&#xff0c;回答了如何在小公司做大模型。 在…

【Linux】进程信号2——阻塞信号,捕捉信号

1.阻塞信号 1.1. 信号其他相关常见概念 在开始内容之前&#xff0c;先介绍一些信号的专业名词&#xff1a; 实际执行信号的处理动作称为信号递达&#xff08;Delivery&#xff09;信号从产生到递达之间的状态&#xff0c;称为信号未决&#xff08;Pending&#xff09;&#…

Log4j2异步打印可变对象的问题

现象 应用代码如下&#xff1a; Test test new Test();test.setA(1);test.setB("1");log.info("before modification: {} \t ",test);test.setA(2);test.setB("2");log.info("after modification: {} \t ",test);问题应用的日志控制…