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

2024-06-16 03:12

本文主要是介绍【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对象

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

这篇关于【C++ | const成员】类的 const数据成员、const成员函数、const对象、mutable 数据成员的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065337

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规