【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++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java8 Collectors.toMap() 的两种用法

《Java8Collectors.toMap()的两种用法》Collectors.toMap():JDK8中提供,用于将Stream流转换为Map,本文给大家介绍Java8Collector... 目录一、简单介绍用法1:根据某一属性,对对象的实例或属性做映射用法2:根据某一属性,对对象集合进行去重二、Du

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别