【C++】C/C++中新const用法:const成员

2024-05-10 12:28
文章标签 c++ 用法 成员 const 中新

本文主要是介绍【C++】C/C++中新const用法:const成员,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎来到CILMY23的博客

本篇主题为: C/C++中新const用法:const成员

个人主页:CILMY23-CSDN博客

系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux

感谢观看,支持的可以给个一键三连,点赞关注+收藏。


写在前头:

在接触C++中 const成员前,我们可以先复习一下C/C++中两种 const 的用法。在指针的入门篇我们写过的知识点(链接),我们主要分为以下两种情况:

  • const关键字可以限制变量不被修改,但是存在可以用指针修改的情况
  • const如果放在 * 的左边,限制的是指针所指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本⾝的内容可变。 
  • const如果放在 * 的右边,限制的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针所指向的内容,可以通过指针改变
  •  如果 两边都有const,那它就会集齐两者,使其变成完全不能修改的指针变量。

那现在函数名称后面居然可以写上const了?那它又是什么意思呢? 


目录

一、认识const成员

二、const成员的概念及特点

2.1 const 成员的概念

2.2 const成员函数的四个问题

2.3 权限的放大什么时候存在?

三、取地址重载和const取地址重载


一、认识const成员

继上篇日期计算器后,现在有一个问题

我们来看这段代码:

在main函数中,我们用 const 修饰了对象 ,

int main()
{const Date d1(2024, 5, 6);d1.Print();return 0;
}

但是这里却无法访问到Print() 成员函数,其实这里涉及权限的放大 

 那如果我们想让它变成可访问的,那就要在成员函数后面增加 const ,这个const修饰的是this指针指向的内容。

//Date.cpp
//日期打印
void Date::Print() const
{cout << "当前日期:"<< _year << "/"<< _month << "/"<< _day<< endl;
}//Date.h
//日期打印
void Print() const;

我们把这里的Print(),就称为const成员函数。 

二、const成员的概念及特点

2.1 const 成员的概念

我们将const修饰的“成员函数”称之为const成员函数const修饰类成员函数,实际修饰该成员函数 隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改

注意:并不是所有的成员函数都需要用const修饰,如果只有读取的类成员函数,那么可以加,如果需要修改类成员变量,那就不能加const。 

2.2 const成员函数的四个问题

  1. const对象可以调用非const成员函数吗?
  2. 非const对象可以调用const成员函数吗?
  3. const成员函数内可以调用其它的非const成员函数吗?
  4. 非const成员函数内可以调用其它的const成员函数吗?

第一个:const对象可以调用非const成员函数吗?

答:不能,因为这里存在权限的放大,d1是const对象,但它不能调用非const成员函数,

第二个: 非const对象可以调用const成员函数吗?

答:可以,这样是权限的缩小,是允许的。

 

 第三个:const成员函数内可以调用其它的非const成员函数吗?

答: 不行,因为这是权限的放大

第四个:非const成员函数内可以调用其它的const成员函数吗?

答:可以,这是权限的缩小 

2.3 权限的放大什么时候存在?

 只有指针和引用才存在权限的放大。

例如: 

三、取地址重载和const取地址重载

类的默认成员函数还剩下取地址重载和const取地址重载,这两个默认成员函数一般不用重新定义,编译器默认会生成。

例如: 

class A
{
public:A* operator&(){return this;}const A* operator&() const{return this;}
};int main()
{A aa1;const A aa2;cout << &aa1 << endl;cout << &aa2 << endl;return 0;
}

 结果如下:

这两个运算符一般情况下我们不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容


总结:

  • 函数后面有 const ,这个const修饰的是this指针指向的内容。
  • 权限可以平移或者缩小,但不可以放大
  • 成员函数,如果是一个对成员变量只进行读访问的函数,那么建议加 const,这样const对象和非const对象都可以使用
  • 成员函数,如果是一个对成员变量要进行读写访问的函数,那么不能加 const,否则不能修改成员变量。
  • const不能加在日期计算器中的流插入和流提取中,因为它没有this指针。
  • 比如想让别人获取到指定的内容,我们才需要重载&运算符const &

感谢各位同伴的支持,本期C++就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞关注+收藏,若有不足,欢迎各位在评论区讨论。    

这篇关于【C++】C/C++中新const用法:const成员的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

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

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

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

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前言:本文将详

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表