C++类中的const使用

news2024/11/18 9:29:35

目录

一,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修饰的对象或函数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于MySQL优化的思考二【性能分析工具、优化原则】

在实际的工作中&#xff0c;我们不免需要对SQL预计进行分析和优化&#xff0c;今天我们就来一起看下相关内容&#xff1a; SQL性能分析 SQL优化原则 1 SQL性能分析 对SQL进行性能分析&#xff0c;主要有&#xff1a; 查看慢SQL 通过profile详情查看 explain执行计划 1.1…

2023年【广东省安全员B证第四批(项目负责人)】考试及广东省安全员B证第四批(项目负责人)试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批&#xff08;项目负责人&#xff09;考试考前必练&#xff01;安全生产模拟考试一点通每个月更新广东省安全员B证第四批&#xff08;项目负责人&#xff09;试题及解析题目及答案&#xff01;多…

Redhat7设置国内可用yum源

问题&#xff1a; 因为最近安装了redhat7&#xff0c;在使用的时候提示系统未注册订阅&#xff0c;无法使用官方的yum源进行安装软件。为此&#xff0c;我使用centos7国内的yum源替换redhat的官方的yum源实现软件安装。 “This system is not registered with an entitlement …

iOS:何为空指针和野指针

一&#xff1a;什么是空指针和野指针 1、空指针 ①.没有存储任何内存地址的指针就成为空指针&#xff08;NULL指针&#xff09; ②.空指针就是被赋值为0的指针&#xff0c;在没有被具体初始化之前&#xff0c;其值为0. //以下都是空指针&#xff0c;eg: Person *p1 NULL; …

CSDN每日一题学习训练——Java版(数据流的中位数、乘积最大子数组、旋转链表)

版本说明 当前版本号[20231113]。 版本修改说明20231113初版 目录 文章目录 版本说明目录数据流的中位数题目解题思路代码思路参考代码 乘积最大子数组题目解题思路代码思路参考代码 旋转链表题目解题思路代码思路参考代码 数据流的中位数 题目 中位数是有序列表中间的数。…

SPSS时间序列模型预测

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

Leetcode刷题详解——解数独

1. 题目链接&#xff1a;37. 解数独 2. 题目描述&#xff1a; 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能…

Vue基础之组件通信(二)

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

ROS基础—话题通信的执行

1、打开终端启动roscore 2、手动添加命令到.bashrc Ⅰ.切换到home目录下&#xff0c;按Ctrlh显示隐藏的文件夹&#xff0c;找到并打开./bashrc。 Ⅱ.在./bashrc最后一行添加命令: # xxx是你工作空间的名称 source ~/xxx/devel/setup.bash 之后保存.bashrc文件即可。 这样子…

IMU识别实验鼠的运动轨迹

临床前通常要做小鼠行为试验。然而&#xff0c;研究人员在观察和分析其行为和反应上往往需要耗费大量时间。针对这种情况&#xff0c;结合目前IMU的飞速发展&#xff0c;香港的研究员们构思了一种基于惯性测量单元&#xff08;IMU&#xff09;的传感器&#xff0c;用于捕获实验…

保姆级vue-pdf的使用过程

第一步 引入vue-pdf npm install --save vue-pdf 第二步 按照需求我们慢慢进行 01.给你一个pdf文件的url&#xff0c;需要在页面渲染 代码 <template><div><pdfref"pdf":src"url"></pdf></div> </template> <…

vue3 setup() 高级用法

文章目录 前言一、选项式API 和 组合式API 区别用一张图告诉你它们的区别&#xff1a; 二、setup 具体怎么用&#xff1f;2.1、setup 什么时候执行&#xff1f;2.2、setup 数据和方法如何使用&#xff1f;2.3、setup 内部有 this 吗&#xff1f;2.4、setup 内钩子函数如何使用&…

SDL2 播放视频数据(YUV420P)

1.简介 这里以常用的视频原始数据YUV420P为例&#xff0c;展示视频的播放。 SDL播放视频的流程如下&#xff1a; 初始化SDL&#xff1a;SDL_Init();创建窗口&#xff1a;SDL_CreateWindow();创建渲染器&#xff1a;SDL_CreateRenderer();创建纹理&#xff1a;SDL_CreateText…

vivado产生报告阅读分析-常规报告2

1、Report I/O “ I/O Report ” &#xff08; I/O 报告 &#xff09; 用于替代 AMD ISE Design Suite PAD 文件。“ I/O Report ”可列出 &#xff1a; • “ Pin Number ” &#xff08; 管脚编号 &#xff09;&#xff1a; 表示器件中的所有管脚 • “ Signal Name ” …

vue3配置@别名

在项目开发中&#xff0c;通常我们是不写相对路径的&#xff0c;因为有些文件需要在不同的文件中使用&#xff0c;如果使用相对路径&#xff0c;那么我们每次去CV路径的时候就要重新修改。因此通常我们是写跟路径的&#xff0c;但是从头开始又太过于麻烦&#xff0c;因此我们使…

ChatGLM3本地部署运行(入门体验级)

文章目录 前言零 硬件小白基知填坑eForce Game Ready驱动程序CUDA常用命令 环境准备NVIDIA驱动更新CUDA安装 部署补充内容体验 前言 学习自B站up主技术爬爬虾&#xff0c;感谢up主提供的整合包&#xff01; 零 硬件 6GB以上显存的NVIDIA显卡&#xff08;品质越高&#xff0c…

22.斐波那契数列数列前20项.

#include<stdio.h>int main(){int i,sum1; int a[100];a[0]0;a[1]1;for(i2;i<20;i){a[i]a[i-1]a[i-2]; sumsuma[i];}printf("斐波那契数列的前20项和为&#xff1a;%d",sum);return 0;}

沧州市壹家人社工小赵庄乡社工站常态化开展关爱一老一小活动

沧州市壹家人社会工作服务中心承接新华区小赵庄乡社工站以来以服务一老一小为工作重点&#xff0c;发挥五社联动的重要作用&#xff0c;开展“幸福院”和“护蕾驿站”两个微项目&#xff0c;聚焦需求&#xff0c;采取社工引领志愿服务的模式&#xff0c;常态化为老人和孩子开展…

Wpf 使用 Prism 实战开发Day05

首页设计 1.效果图 一.代码现实 根据页面布局&#xff0c;可以将页面设计成3行&#xff0c;每行中分多少列&#xff0c;看需求而定根据页面内容&#xff0c;设计Model 实体类&#xff0c;以及View Model 1.Index.xaml 页面布局设计 RowDefinition 分行&#xff08;Row&#xf…

【LeetCode】每日一题 2023_11_12 每日一题 Range 模块(线段树)

文章目录 刷题前唠嗑题目&#xff1a;Range 模块题目描述代码与解题思路 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 嗯&#xff1f;怎么是 hard&#xff0c;好长&#xff0c;可恶&#xff0c;看不懂&#xff0c;怎么办 题目&#xff1a;Range 模块 题…