【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

相关文章

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意