C++ 关于“常量”的知识整理:

目录

1 常量对象:

2 常量成员:

2.1常量数据成员:

常数据成员总结:

2.2常量成员函数(使用最多):

常成员函数总结:

3 常量引用:


C++中常量的值在程序运行中不允许被改变,定义或声明常量时必须初始化!

常量对象:

常量对象的数据成员的值始终为初始化所赋值,在整个对象生命周期内不允许被修改

const class 对象名 {初始化列表};
class const 对象名 {初始化列表};

引例:

class A 
{
public:A(int i):id(i) //构造函数 {	}void set(int i)//修改id的值{id = i;}~A(){	}//析构函数
private:int id; //编号
};int main()
{//定义常量对象A const a{ 1 };//写法1const A b{ 1 };//写法2//错误:常量对象的数据成员不允许被修改!!!//a.set(10);//错误a的值不能修改//b.set(20);//错误b的值不能修改return 0;
}

常量成员:

类的常量成员包括常量成员函数和常量数据成员。

常量数据成员:

常量数据成员要求,自第一次赋值之后,数据不允许更改;

引例:居民身份证号

const 数据类型 变量名;

赋值方式:定义时在后面直接赋值;构造函数的初始化列表内赋值;

                若两种赋值方式同时出现时,以构造函数的具体赋值为准;


class A
{
private:const int a = 10;const int b = 20;public:A(int c, int d) :a(c), b(d) {//a = c;//错误的//b = d;//仅有允许在初始化列表赋值!函数内部错误};A() {};//重载函数:无参数时构造函数不再赋值常数据成员。void show()const//自觉设为常函数,避免复杂设计时错误产生{cout << "const a:" << a << "       const b:" << b << endl;}
};int main()
{A a(100, 200);//a对象采用初始化定义和构造函数初始化列表赋值两种方式//以初始化列表中数值为准a.show();A b;//无参数时构造函数不再赋值常数据成员//b 对象采用定义的同时初始化,推荐此类方式!b.show();return 0;
}

常数据成员总结:

  1. 两种赋值方式都存在时,以构造函数初始化列表内数据为准
  2. 构造函数为常数据成员赋值时,仅能采用函数初始化列表的方式
  3. 构造函数的函数主题内赋值常数据成员是错误的,而类内普通数据成员可以在参数列表或函数主题中完成初始化,二选一即
  4. 推荐使用定义常数据成员的同时赋值

常量成员函数使用最多):

返回值 函数名(参数列表) const;

常量成员函数限定两个因素:成员函数(访问对象的所有数据)、常量(限定对象的数据不能被修改)

结构说明:

  1. C++中所有的成员函数中都隐含一个指向对象的this指针,也正是因为this 隐含,const无法直接限定对象,只能放在函数最后!!!注意区分常量引用,const 位于参数列表;
  2. const 作为常量限定的关键字,在声明和定义实现的两处都有(区别于:友元、静态,仅声明处有,定义处没有);
  3. const 可以作为重载函数的区分,加const 与未加const 为重载函数
class A
{
public:A(int i) :id(i)  {	}//构造函数void set(int i)//修改id的值{id = i;cout << "修改后的值:";show();}void show()const//常函数:输出{cout << "id=" << id << endl;//error: id++;// 错误原因:常函数内对象的数据不允许被修改// //error:set(2);//错误原因:常函数内可以调用常函数,不能调用普通函数}~A() {	}//析构函数
private:int id; //编号
};int main()
{A  a{ 1 };//普通对象const A b{ 1 };//常对象a.show();b.show();a.set(2);// error:b.set(2);//出错原因:常对象只能调用常函数return 0;
}

常成员函数总结:

  1. 常成员函数内不允许修改对象的值
  2. 常成员函数内可以调用常成员函数,而不允许调用普通函数
  3. 常对象仅能调用常成员函数,不能调用普通成员函数
  4. 普通对象既能调用普通成员函数,又能调用成员函数
  5. 普通成员函数内既能调用常成员函数,又能调用普通成员函数

权限仅能缩小传递,不能放大传递

注意:在函数设计时,如若对象的数据成员无需修改则定义为常函数,在函数声明和定义最后加const 关键字限定!

避免常对象无法正确调用函数、函数内错误修改不必要修改的值

常量引用:

常量引用:用const 修饰引用,则不能通过引用修改原对象的数据成员(修饰形参)

const 类型 & 变量名;//格式
void Show(const int& x)
{//x++; //错误,常量引用作为形参,其值不能被改变cout << x << endl;
}
int main()
{int i = 12;Show(i);return 0;
}

主要使用场景:修饰形参

class A
{
public:A(int a = 0, int b = 0) :m_a(a), m_b(b){}A(const A& ca)//拷贝构造函数,不允许修改ca的内容{m_a = ca.m_a;m_b = ca.m_b;}
private:int m_a;int m_b;
};int main()
{A a{10,20};A b{ a };return 0;
}

区分:const放在函数最后(常成员函数)const 放在函数参数列表(常引用)

    • 常函数修饰函数,限制函数内隐含指向对象的this指针,使得函数主体内对象的数据成员不允许被修改。
    • 常引用修饰形参,限制引用的"一改同改"的特性,因而不允许修改参数对象的数据成员,即同时满足引用和常量的性质

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

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

相关文章

调用阿里通义千问大语言模型API-小白新手教程-python

阿里大语言模型通义千问API使用新手教程 最近需要用到大模型&#xff0c;了解到目前国产大模型中&#xff0c;阿里的通义千问有比较详细的SDK文档可进行二次开发,目前通义千问的API文档其实是可以进行精简然后学习的,也就是说&#xff0c;是可以通过简单的API调用在自己网页或…

Redis为什么速度快:数据结构、存储及IO网络原理总结

Redis&#xff0c;作为内存数据结构存储的佼佼者&#xff0c;其高性能表现一直备受赞誉。那么&#xff0c;Redis究竟是如何实现这一点的呢&#xff1f;接下来&#xff0c;我们将更深入地探讨其背后的关键技术&#xff0c;并提供进一步的优化策略。 一、内存存储与数据结构设计…

【开源】基于JAVA语言的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

【现代控制系统】从状态方程导出微分方程

从状态方程导出微分方程 2023年6月20日 1. 基本方法 状态空间表达式&#xff1a; x ˙ ( t ) A x ( t ) B u ( t ) y ( t ) C x ( t ) D u ( t ) \begin{aligned} &\dot{ x}(t){ A }{ x }(t){ B }{ u } (t) \\ &{ y }(t){ C } { x }(t){ D } { u }(t) \end{alig…

基于Javaweb开发的二手图书零售系统详细设计【附源码】

基于Javaweb开发的二手图书零售系统详细设计【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统…

java的==运算符和equals详解

①chatgpt的解释 在Java中&#xff0c;和equals都是用于比较两个对象的操作符&#xff0c;但它们的行为和用途有所不同。 操作符&#xff1a; 对于基本数据类型&#xff0c;比较的是它们的值是否相等。例如&#xff0c;int a 5; int b 5; System.out.println(a b); // 输出t…

内网穿透natapp使用教程(Linux)

我的使用场景&#xff1a;在家访问学校服务器&#xff0c;由于不在一个局域网&#xff0c;所以需要使用内网穿透&#xff0c;我使用的是natapp。需要在有局域网的时候做好以下步骤。 &#xff08;natapp官网&#xff1a;https://natapp.cn/&#xff09; 1. 下载客户端 &#x…

springboot入门2

学习目标&#xff1a; 了解数据库配置加密方法&#xff0c;数据库连接池&#xff0c;mybatis-paginationInterceptor分页&#xff0c;pagehelper分页常用功能 学习内容&#xff1a; 1、mybatis plus配置加密 1.1、生成加密配置 package sccba.example;import com.baomidou…

盲盒App小程序开发:引领未来购物新潮流

随着科技的不断发展&#xff0c;我们的购物方式也在不断改变。近年来&#xff0c;盲盒购物逐渐成为了一种新型的消费模式&#xff0c;受到了广大消费者的热烈欢迎。为了满足消费者的需求&#xff0c;越来越多的企业开始涉足盲盒App的开发。本文将探讨盲盒App开发的意义、前景以…

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现IIC控制OLED屏幕

上一篇&#xff1a;[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集 [嵌入式软件][启蒙篇][仿真平台]STM32F103实现定时器 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现IIC控制OLED屏幕 文章目…

【GitHub项目推荐--国外名校AI教程】【转载】

这个开源项目搜集了 YouTube 上优质的机器学习教程&#xff0c;方向包括机器学习、深度学习、计算机视觉、自然语言处理、无监督学习等等。 开源地址&#xff1a;https://github.com/dair-ai/ML-YouTube-Courses

[260. 只出现一次的数字 III](C语言题解)(位运算)(力扣)

> Problem: [260. 只出现一次的数字 III](260. 只出现一次的数字 III - 力扣&#xff08;LeetCode&#xff09;) # 思路 > 想到数组中只有一个数只出现了一次的解法&#xff1a;**所有数异或&#xff0c;最后答案就是那个只出现一次的数**&#xff0c;该题只需将两个不…

Kubernetes成本优化

云原生可以帮助团队更精细化利用资源&#xff0c;但如果缺乏工具的帮助&#xff0c;很难采取适当的措施优化资源的使用。本文介绍了若干用于可视化Kubernetes资源使用情况的工具&#xff0c;并且可以自定义策略优化资源使用&#xff0c;实现更好的成本优化。原文: Kubernetes C…

《WebKit 技术内幕》学习之十五(5):Web前端的未来

5 Crosswalk项目 Crosswalk项目是由英特尔公司发起的一个开源项目&#xff0c;该项目基于WebKit&#xff08;Blink&#xff09;和Chromium等开源项目打造&#xff0c;其目的是提供一个跨不同操作系统的Web运行环境&#xff0c;包括Android、Tizen、Linux、Windows、MacOS等众多…

python使用PaddleOCR实现《命名实体识别项目》OCR(已实现)(ai领域必看,简单易用)

1.简介&#xff1a; PaddleOCR是飞桨&#xff08;PaddlePaddle&#xff09;推出的一个端到端的光学字符识别开源工具集&#xff0c;支持中文、英文、数字以及特殊符号等各种类型的文字检测、识别和词语整体识别。该工具集使用PaddlePaddle深度学习框架技术&#xff0c;提供了多…

Likeshop多商户商城源码系统,支持二开

在电商行业高速发展的当下&#xff0c;拥有一套功能强大、易于操作的开源商城系统至关重要。Likeshop多商户商城系统正是这样一款集H5、小程序、独立APP于一体的开源电商解决方案&#xff0c;助力商家实现智能营销。 一、产品简介 Likeshop多商户商城系统为商家提供了丰富的营…

Spring Boot 中 Service 层依赖注入问题

目录 问题描述 产生错误 问题原因 解决方法 手动注入方法 1、使用工具集 hutool&#xff0c;引入 Maven 依赖 2、编写 SpringUtil 工具类 问题描述 Controller 层方法为 static 静态&#xff0c;引入 Service 层时使用 Autowired 注解自动装配&#xff0c;Controller层方…

C#用 DateAndTime.DateAdd方法和DateTime.Add(TimeSpan) 方法分别添加一段时间间隔

目录 一、基本方法 1.用 DateAndTime.DateAdd方法添加一段时间间隔 2.用DateTime.Add方法添加一段时间间隔 二、实例 1.实例1&#xff1a;用 DateAndTime.DateAdd方法 2.实例2&#xff1a;用DateTime.Add方法 一、基本方法 1.用 DateAndTime.DateAdd方法添加一段时间间隔…

Android发展历程及安装

目录 发展历程 下载网址 安装过程 发展历程 安卓基于Linux内核&#xff0c;Linux内核相当于房屋的地基 开源不等于免费&#xff0c;不能商用 安卓一般每半年小更新&#xff0c;一年大更新 对应API相当于别名 现在安卓安全性越来越高&#xff0c;性能越来越快&#xff0c…

2024年预制菜行业市场发展趋势分析(2021-2023年预制菜行业数据分析)

近期&#xff0c;老干妈被称为预制菜、预制菜国标报送稿出炉等事件再次引起大众对于预制菜市场的讨论。随着国家对预制菜审核标准的严格化&#xff0c;预制菜市场未来走向将会如何&#xff1f;鲸参谋带大家从数据角度来了解。 首先来看下预制菜市场的行业发展情况。 根据鲸参…