C++类中的const使用

目录

一,const成员函数

1,const成员函数的语法

2,相同限定符之间的调用

3,不同限定符对象与函数的调用

4,不同限定符函数之间的调用 


一,const成员函数

1,const成员函数的语法

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

定义方式和使用如下图:

        总的来说,当修饰this指针指向对象的成员时,只需在函数后面加上const即可。

2,相同限定符之间的调用

        这里要说明的是const与const修饰的对象和函数是可以相互调用的;非const与非const修饰的对象和函数也是可以相互调用的。

#include <iostream>
using namespace std;
class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print1() const {
		cout << _year << "年" << _month << "月" << _day << endl;
		this->Print2();//调用const成员函数Print2
	}
	void Print2() const{
		cout << _year << "年" << _month << "月" << _day << endl;
	}
	void Print3() {
		cout << _year << "年" << _month << "月" << _day << endl;
		this->Print4();//调用非const成员函数Print4
	}
	void Print4() {
		cout << _year << "年" << _month << "月" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2023, 10, 16);
	d1.Print3();
	const Date d2(2022, 10, 16);
	d2.Print1();
	return 0;
}

        3,const成员函数内可以调用其它的非const成员函数吗?

        4,非const成员函数内可以调用其它的const成员函数吗?

3,不同限定符对象与函数的调用

        首先我们先观察const对象调用非const成员函数和非const对象调用const成员函数两个问题。

#include <iostream>
using namespace std;
class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print() const {
		cout << _year << "年" << _month << "月" << _day << endl;
	}
	void print() {
		cout << _year << "年" << _month << "月" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2023, 10, 16);
	d1.Print();//正常运行
	const Date d2(2022, 10, 16);
	d2.print();//运行报错
	return 0;
}

分析:

        可发现,const对象不可以调用非const成员函数,但非const对象可以调用const成员函数。这里其实还是设计到权限放大与缩小的知识——权限可以缩小,但权限不能放大。

        当const对象调用非const成员函数时,相当于权限放大。对于const对象而言,其所有成员函数都不能修改对象成员的数值,但非const成员函数可以修改对象成员的数值,将原对象的权限放大。

        当非const对象调用const成员函数时,相当于权限缩小。对于非const对象而言,其所有成员的数值都可以被修改,const成员函数只是限定了此函数中对象成员的数值不可被修改,没有违反规定,只是将权限缩小而已。

4,不同限定符函数之间的调用 

       有了以上的知识再来思考const成员函数调用其它的非const成员函数和非const成员函数调用其它的const成员函数,不难理解,非const成员函数是可以调用const成员函数,但const成员函数是不能调用非const成员函数,这跟对象调用函数时的情况一样。

class Date
{
public:
    Date(int year = 1, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    void Print1() const {
        this->Print4();//系统报错
    }
    void Print2() const{
    }
    void Print3() {
        this->Print2();//正常运行
    }
    void Print4() {
    }
private:
    int _year;
    int _month;
    int _day;
};

分析:

        当非const成员函数调用const成员函数时,非const成员函数对象成员的数值可以修改,当调用const成员函数时,在const成员函数内部中将权限缩小,内部对象成员的数值都不可修改,没有违反语法规定,因此可以被调用。

        当const成员函数调用非const成员函数时,主体const成员函数已经被限定权限了,当调用非const成员函数时,在const成员函数内部中将权限放大,内部对象成员的数值都可以修改,违背了const的限定,所以不能调用。

总结:const的调用满足权限可以缩小但不可以放大,也就是说非const修饰的对象或函数可以调用const修饰的对象或函数。但const修饰的对象或函数不可调用非const修饰的对象或函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/140761.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分享一个个人博客神器 VanBlog

一、先看效果图 这是前台页面&#xff0c;我已经发布了一篇文章 这是后台页面 一句话&#xff0c;真的好用&#xff0c;各种功能一应俱全&#xff0c;废话不多说&#xff0c;开始吧。 二、 安装docker容器技术 如果你没有安装 docker 和 docker-compose&#xff0c;可以通…

深度学习AIR-PolSAR-Seg图像数据预处理

文章目录 深度学习sar图像数据预处理一.图片预处理操作1.log(1x)处理2.sqrt平方化处理 二.原网络训练效果展示原始数据训练效果展示&#xff1a; 三.对比实验1.采用原始数据2.采用取log(1x)后的数据3.采用取平方后归一化处理&#xff1a; 四.总结&#xff1a;五.思考 深度学习s…

eNSP启动路由器一直出#号、以为是安装配置winpcap的问题。。。。(以为是win10安装winpcap失败的问题。。。)

问题描述&#xff1a;eNSP启动一直出#号的一种参考方法_ensp一直#_Hong的博客-CSDN博客 原因是看了这篇博客&#xff0c;觉得ensp启动路由器的时候一直出现&#xff03;号是因为winpcap安装的时候出现的问题。查看自己的winpcap安装成功之后的目录是&#xff1a; 然后因为那篇…

2783爱心公益网站的设计与实现JSP【程序源码+文档+调试运行】

一、摘要 本文将详细介绍一个基于Web的爱心公益网站的设计和实现。该网站包括前台用户模块和后台管理员模块&#xff0c;能够满足用户和管理员的不同需求。通过对用户和管理员的功能需求分析&#xff0c;本文将重点阐述数据库设计和界面设计的关键环节&#xff0c;同时介绍如何…

北邮22级信通院数电:Verilog-FPGA(9)第九周实验(1)实现带同步复位功能、采用上升沿触发的D触发器

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.顶层模块的书写 二.两种验证方法 2.1使用…

Azure 机器学习:在 Azure 机器学习中使用 Azure OpenAI 模型

目录 一、环境准备二、Azure 机器学习中的 OpenAI 模型是什么&#xff1f;三、在机器学习中访问 Azure OpenAI 模型连接到 Azure OpenAI部署 Azure OpenAI 模型 四、使用自己的训练数据微调 Azure OpenAI 模型使用工作室微调微调设置训练数据自定义微调参数部署微调的模型 使用…

leetCode 92.反转链表 II + 图解

92. 反转链表 II - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 206. 反转链表 - 力扣&#xff08;LeetCode&am…

python RSA 2048位 已知P,Q计算出E和D

这个软件居然不保存D&#xff0c;吓死宝宝了。刚把公钥【公钥指数&#xff08;E&#xff09;和模数&#xff08;N&#xff09;】发给客户&#xff0c;自己写代码找D【私钥指数&#xff08;E&#xff09;】居然没保存。 试了一个随机的生成的一对key pair&#xff0c;可以找回。…

GPU Microarch 学习笔记【2】Unified Memory

目录 1. M3 Dynamic Caching 2. Unified Memory 3. Unified Memory是如何处理page fault的 4. Unified Memory Page Fault的相关论文 M3 Dynamic Caching 最新的Apple M3 芯片最亮眼的可能是支持dynamic caching&#xff0c;如下图所示。 具体说来就是传统的GPU分配内存时&…

MySQL的SQL预编译及防SQL注入

文章目录 1 SQL语句的执行处理1.1 即时SQL1.2 预处理SQL1.2.1 预编译SQL的实现步骤1.2.2 预编译SQL的C使用举例1.2.3 MYSQL_BIND()函数中的参数类型&#xff1a; 2 SQL注入2.1 什么是SQL注入2.2 如何防止SQL注入 1 SQL语句的执行处理 SQL的执行可大致分为下面两种模式&#xf…

计算机毕业设计选题推荐-课程学习微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Centos7 升级到 Centos8 教程以及关于dnf包管理工具的若干问题解决方案

目录 为什么升级一、参考文档二、升级步骤三、安装git编码错误缓存问题安装git依赖冲突问题解决办法 为什么升级 jenkins 2.4版本需要CentOS8 一、参考文档 点我 二、升级步骤 1.安装epel源 yum -y install epel-release2.安装rpmconf和yum-utils yum -y install rpmco…

基于RK3568的跑步机方案

I 方案简介 一、跑步机的来历 跑步机是家庭及健身房常备的健身器材&#xff0c;而且是当今家庭健身器材中最简单的一种&#xff0c;是家庭健身器的最佳选择。1965年北欧芬兰唐特力诞生了全球第一台家用的跑步机&#xff0c;设计师根据传速带的原理改变而成。 二、…

岗前酒精检测仪

岗前酒精检测仪&#xff1a;集“酒精检测智能测温人脸考勤”三合一智能检测仪。 酒精检测功能&#xff1a;采用电化学传感器检测检测酒精浓度&#xff0c;具有吹气中断及吹气流量侦测&#xff0c;吹气防欺骗设计&#xff0c;吹气温度及吸气侦测&#xff1b;响应时间≤20毫秒&am…

NIO的浅了解

一、五种IO类型 1、阻塞IO 用户进程一直等待数据准备好&#xff0c;在复制完成之前都是阻塞的 2、非阻塞IO 用户进程需要不断轮询查看是否数据准备好 优化了提升并发连接数量&#xff0c;但是每一个请求都需要创建一个socket建立连接&#xff0c;每个线程都需要去遍历轮询&am…

数字三角形模型 笔记

方格取数 走两次的最大值 f[k][i1][i2]来表示 k i1 j1 i2 j2; 每一个状态可由四种状态转换来&#xff0c;分别为 第一条路走下&#xff0c;第二条路走下 第一条路走下&#xff0c;第二条路走右 第一条路走右&#xff0c;第二条路走下 第一条路走右&#xff0c;第二条…

三国杀中的概率学问题4——曹冲

前言 这篇文章是围绕曹冲的称象技能展开的一些数学上的讨论&#xff0c;将涉及到积分、概率论等知识&#xff0c;并会做很多拓展。 值得说明的是&#xff0c;本文受到了这篇文章的一些启发。 连续情形1 先来看一个连续情形的问题。 问题一&#xff1a;假设每张牌的点数是0~1…

力扣刷题-二叉树-对称二叉树

101 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 思路 我的思路…

Unity--互动组件(Button)

1.组件的可交互 2.组件的过渡状态 3.组件的导航 4.组件的Event Button “”组件的可交互&#xff1a;“” Interactable&#xff1a; 该组件是否可点击&#xff08;设置为false时&#xff0c;将禁用交互&#xff0c;并且过渡状态将设置为禁用状态&#xff09;&#xff1b;…

深入理解C++关联式容器:set、multiset、map和multimap详解

序列式容器 与 关联式容器 我们知道&#xff1a; C 中&#xff0c;我们将 vector、list、queue 这种底层为线性序列的数据结构叫做 序列式容器&#xff0c;其存储的就是元素本身。而 关联式容器 以键-值对的形式存储数据。每个键在容器中必须是唯一的&#xff0c;而值则与相应…