C++const关键字

news2024/11/25 19:47:31

本文旨在讲解C++中相关const关键字的详解,希望读完本篇文章,可以让诸位对C++中的const关键字有更深一步的认识!


在C++中,若想让类中某一个变量不再改变,可以使用const关键字进行修饰,让数据不被修改,使其变为常量属性。当然const不仅可以修饰类中的变量,还可以修饰类中的函数,二者没有太大的区别,下面来详细讲解一番。


const对类中成员变量的修饰

const可以对类中的成员变量进行修饰,让其变为一个常量值,不能被修改,下面可以通过一番代码来观察const对类中成员变量的修饰!

class Data
{
public:
	void print()const
	{
		check();
	}
	Data(int year, int month, int day)
	{
        //这里对const常变量year进行修改!!!
		_year = year;
		_month = month;
		_day = day;
	}
	void check()const
	{
		cout<<"check()"<<endl;
	}
private:
    //在类中声明直接默认初始化!
	const int _year=1;
	int _month=1;
	int _day=1;
};
int main()
{
	Data a(2023,9,19);
	a.print();
}

通过以上代码可以看出,因为在类中对成员变量_year进行了const修饰,但是在构造函数中又尝试对_year进行修改,那么编译器肯定会报错,报错结果入下:

从以上代码可以看出,当对成员变量进行const修饰之后,便不能再对其值进行修改了,因为其具有了常数性,所以一旦尝试对其进行修改,那么编译器便会报错!


const对类中函数的修饰

在C++中,当对类中的函数进行修饰时,其const位置应该放在函数的后面,分号之前,下面是const对类的函数的修饰:

可以看出const的位置是在函数括号之后进行修饰,而不是在函数返回值的前面进行const修饰,一旦在void前加上const表示函数的返回值不能改变!!!

还需要注意的一点是:

当用const对类中函数进行修饰时,被const修饰的函数不能再调用其他没有被const修饰的函数!!因为一旦进行调用,这里会涉及到权限的放大!可以通过以下代码来观察上述所讲情况!

通过上述报错信息可以看出,当被const修饰的函数print 调用check函数时,编译器给出报错信息,这里明确给出,不能将this指针转化!!!


const位置不同->作用不同

  • 函数开头的 const 用来修饰函数的返回值,表示返回值是 const 类型,也就是不能被修改,例如const int gettop()。
  • 函数头部的结尾加上 const 表示常成员函数,这种函数只能读取成员变量的值,而不能修改成员变量的值,例如void print() const

通过以上的const介绍后,来看一下相关例题!

const相关问题:

1和3答案是正确的!可以调用,这里涉及的是权限的放小!

2和4答案是错误的!不可以调用,因为这涉及到了权限的放大!


总结:1.在 C++ 中,const 也可以用来修饰对象,称为常对象。一旦将对象定义为常对象之后,就只能调用类的 const 成员(包括 const 成员变量和 const 成员函数)了。

2.const的修饰,可以对一些数据起到保护作用,例如:当对日期-日期时,获得的值就可以用const来修饰!以此来保护数据!防止数据被修改!


好的,今日有关const的分享到此结束,希望能对大家有一定的收获!

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

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

相关文章

【AI视野·今日Robot 机器人论文速览 第三十六期】Tue, 19 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 19 Sep 2023 (showing first 100 of 112 entries) Totally 112 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers General In-Hand Object Rotation with Vision and Touch Authors Haozhi Qi, Brent Yi…

element-ui问题合集(el-input-number加减一次就失效,el-select同时收集id与name)

el-select同时收集id与name 将id与name拼接成字符串&#xff0c;赋值给value&#xff0c;在使用时&#xff0c;获取value后&#xff0c;再使用split()方法进行分割 <el-select><el-option v-for"item in selectAttr" :label"item.name" :value&…

【深度学习-第3篇】使用MATLAB快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例

在本文中&#xff0c;我们将介绍如何使用 MATLAB 中的 Convolutional Neural Network&#xff08;CNN&#xff09;进行分类任务。我们将使用 MATLAB 的 Deep Learning Toolbox 来创建、训练和评估 CNN。 一、一个简单的案例 1 安装和准备 首先&#xff0c;确保已安装 MATLAB…

chat-gpt笔记:参数temperature与top_p

temperature 官方文档 temperature number or null Optional Defaults to 1 What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We…

Apache Hive 入门

目录 一、Apache Hive概述 1.1 什么是Hive ​1.2 为什么使用 Hive 1.3 Hive 和 Hadoop 关系 二、场景设计&#xff1a;如何模拟实现Hive功能 2.1 如何模拟实现 Apache Hive 的功能 2.2 映射信息记录 2.3 SQL 语法解析、编译 2.4 最终效果 ​三、Apache Hive 架…

【链表】K 个一组翻转链表-力扣 25 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

【前端知识】Three 学习日志(九)—— 阵列立方体和相机适配体验

Three 学习日志&#xff08;九&#xff09;—— 阵列立方体和相机适配体验 一、双层for循环创建阵列模型 //创建一个长方体几何对象Geometry const geometry new THREE.BoxGeometry(100, 100, 100); //材质对象Material const material new THREE.MeshLambertMaterial({col…

卷运维不如卷网络安全

最近发现很多从事运维的选择了辞职&#xff0c;重新规划自己的职业发展方向。运维工程师这个岗位在IT行业里面确实是处于最底层的&#xff0c;不管什么环节出现问题&#xff0c;基本都是运维背锅。背锅也就罢了&#xff0c;薪资水平也比不上别的岗位。 一般运维的薪资水平大多数…

【Spark】win10配置IDEA、saprk、hadoop和scala

终于&#xff0c;要对并行计算下手了哈哈哈。 一直讲大数据大数据&#xff0c;我单次数据处理量大概在1t上下&#xff0c;是过亿级的轨迹数据。 用python调用multiprogress编写的代码&#xff0c;用多线程也要一个多月跑完。 我对这个效率不太满意&#xff0c;希望能快一点再快…

Mac cocoapod 3分钟安装教程( 国内镜像源方法)

参考链接&#xff1a;2023最新总结&#xff0c;Mac下使用Homebrew完全指南&#xff01; - 知乎 1.打开终端&#xff0c; 执行&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 2.运行&#xff0c;可以选择清…

十、性能测试之数据库测试

性能测试之数据库测试 一、 数据库分类二、 mysql安装及密码的修改1、安装&#xff1a;数据库的版本 mysql5.7版方法1&#xff1a;直接安装方法2&#xff1a;使用rpm包安装方法3&#xff1a;docker方式安装 2、修改数据库的密码3、创建库4、创建表 三、存储引擎1、InnoDB特点 2…

【Java 基础篇】Java字节打印流详解:处理二进制数据的利器

当你需要将数据输出到文件或其他输出目标时&#xff0c;Java中的字节打印流是一个非常有用的工具。本文将详细介绍Java字节打印流&#xff0c;包括它的基本用法、常用方法以及一些实际应用示例。 什么是字节打印流&#xff1f; 在Java中&#xff0c;字节打印流是用于将字节数…

【MATLAB】安装 shared_slreportgen_reportexplorer_common 时检测到以下错误

解决方法 下载matlab的时候以及安装的时候关闭杀毒软件。 然后也可以把simulink和DSP以及signal processing 相关的toolbox全部不勾选&#xff08;推荐&#xff09; 这两个工具箱没有其实没啥大的影响&#xff0c;就是信号处理这块的增强功能没有了 &#xff08;来自&#xff…

【Windows】你所使用的用户账户没有启用此任务的权限

【Windows】你所使用的用户账户没有启用此任务的权限 1. 故障现象 有一台腾讯云的服务器更新补丁,更新后需要禁用自动重启.发生了以下报错 2. 解决方法 2.1 下载pstools 工具下载地址 https://learn.microsoft.com/zh-cn/sysinternals/downloads/pstools 将软件复制到桌…

理解MTU VLAN与端口VLAN两个概念

什么是MTU VLAN MTU VLAN 是指将最大传输单元&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;设置为特定值以适应 VLAN 环境的配置。 MTU 是指在网络通信中可以传输的最大数据包大小。以太网的常见 MTU 值为1500字节&#xff0c;这是指在以太网帧中的数据…

【hudi】数据湖客户端运维工具Hudi-Cli实战

数据湖客户端运维工具Hudi-Cli实战 help hudi:student_mysql_cdc_hudi_fl->help AVAILABLE COMMANDSArchived Commits Commandtrigger archival: trigger archivalshow archived commits: Read commits from archived files and show detailsshow archived commit stats: …

<硬件设计>运放+三极管组成的恒流源VI电路设计与分析

目录 01 原理介绍&描述 运放的虚短和虚断 02 恒流源描述&分析 简单恒流源电路 简单恒流源电路描述 恒流源电路分析 恒流源VI电路 恒流源VI电路描述 恒流源VI电路分析 恒流源应用场景 03 恒流源VI电路示例 示例原理图&描述 恒流原理分析 恒流原理 恒…

毕业设计|基于51单片机的空气质量检测PM2.5粉尘检测温度设计

基于51单片机的空气质量检测PM2.5粉尘检测温度设计 1、项目简介1.1 系统构成1.2 系统功能 2、部分电路设计2.1 LED信号指示灯电路设计2.2 LCD1602显示电路2.3 PM2.5粉尘检测电路设计 3、部分代码展示3.1 串口初始化3.1 定时器初始化3.2 LCD1602显示函数 4 演示视频及代码资料获…

Java实现截取视频第一帧

目录 前言 一、通过Java借助第三方库实现 1.引用ffmpeg 使用maven&#xff0c;导入pom依赖&#xff1a; 工具类 2.引用jcodec 二、使用第三方存储自带的方法实现&#xff08;如阿里云OSS、华为云OBS&#xff09; 前言 在实际项目中&#xff0c;会遇到上传视频后&#xf…

SpringBoot轻松实现项目集成Knife4j接口文档

Knife4j 介绍 Knife4j 官网 Knife4j是一款基于Swagger生成API文档的增强工具&#xff0c;它简化了开发者构建和管理RESTful API文档的过程。通过自动扫描项目中的接口信息&#xff0c;Knife4j能够生成详细、易读的API文档&#xff0c;无需手动编写和维护。它提供交互式的接口调…