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.hqwc.cn/news/434713.html

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

相关文章

QT+VS实现Kmeans聚类算法

1、Kmeans的定义 聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程&#xff0c;聚类就是一种发现这种内在结构的技术&#xff0c;聚类技术经常被称为无监督学习。k均值聚类是最著名的划分聚类算法&#xff0c;由于简洁和效率使得他成为所有聚类算法中最广泛使…

YOLOv8改进 | Conv篇 | 结合Dual思想利用HetConv创新一种全新轻量化结构CSPHet(参数量下降70W)

一、本文介绍 本文给大家带来的改进机制是我结合Dual的思想利用HetConv提出一种全新的结构CSPHet,我们将其用于替换我们的C2f结构,可以将参数降低越75W,GFLOPs降低至6.6GFLOPs,同时本文结构为我独家创新,全网无第二份,非常适合用于发表论文,该结构非常灵活,利用Dual卷…

09. Springboot集成sse服务端推流

目录 1、前言 2、什么是SSE 2.1、技术原理 2.2、SSE和WebSocket 2.2.1、SSE (Server-Sent Events) 2.2.2、WebSocket 2.2.3、选择 SSE 还是 WebSocket&#xff1f; 3、Springboot快速集成 3.1、添加依赖 3.2、创建SSE控制器 3.2.1、SSEmitter创建实例 3.2.2、SSEmi…

YOLO自制数据集及训练

使用 Make Sense 网站进行标注 https://www.makesense.ai/可以让AI帮你先标一下 一定要点一下 + ,不然不会加进去 导出标签

Linux版本下载Centos操作

目录 一、Centos7 二、下载Centos7镜像 三、下载Centos7 买了个硬件安装裸机&#xff08;一堆硬件&#xff09; 把安装盘放到虚拟机里面&#xff0c;给机器加电 配置设置 ​编辑 网络配置 开启网络功能 四、安装linux客户端 Xshell是什么 Xshell使用&#xff08;连接…

电商系统设计到开发03 引入Kafka异步削峰

一、前言 系统设计&#xff1a;电商系统设计到开发01 第一版设计到编码-CSDN博客 接着上篇文章&#xff1a;电商系统设计到开发02 单机性能压测-CSDN博客 本篇为大制作&#xff0c;内容有点多&#xff0c;也比较干货&#xff0c;希望可以耐心看看 已经开发的代码&#xff0…

Android SharedPreferences源码分析

文章目录 Android SharedPreferences源码分析概述基本使用源码分析获取SP对象初始化和读取数据写入数据MemoryCommitResultcommitToMemory()commit()apply()enqueueDiskWrite()writeToFile() 主动等待写回任务结束 总结 Android SharedPreferences源码分析 概述 SharedPrefer…

Modelarts还能做预测银行存款,我的自动学习案例上新了

前言 最近我计划学习一下机器学习的相关技术&#xff0c;之前体验华为云CodeArts Snap的时候&#xff0c;重拾了一下Python。 然后就信心满满的打开了Python机器学习的教程&#xff0c;发现比想象中的难。 总觉得欠缺了些什么支撑自己的学习兴趣&#xff0c;正好最近在体验M…

前景贴纸类特效SDK,面向企业的技术解决方案

随着数字媒体技术的快速发展&#xff0c;视频内容在社交媒体、广告、教育等领域的应用越来越广泛。为了增加视频的吸引力和趣味性&#xff0c;许多企业开始寻求在视频中添加特效和贴纸。美摄科技的前景贴纸类特效SDK为企业提供了一种高效、灵活的解决方案&#xff0c;满足不同的…

循环的乐章与爱情的旋律

循环的乐章与爱情的旋律 The Rhapsody of Loops and the Melody of Love 在一个阳光明媚的Java编程课上&#xff0c;男主角林浩然&#xff0c;一个热衷于代码逻辑和算法谜题的大二学生&#xff0c;正沉浸在他的Java世界里。而女主角杨凌芸&#xff0c;则是班级中出了名的“程序…

【C++干货铺】C++中的IO流和文件操作

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 C语言的输入输出 流是什么&#xff1f; C的IO流 C标准IO流 C文件IO流 文本文件读写 二进制文件的读写 stringstream的简单介绍 将数值类型数据格式化为字…

【排序4】探秘归并排序:提高程序效率的必备技巧

&#x1f60a;归并排序 &#x1f38a;1、基本思想&#x1f38a;2、代码示例&#x1f38a;3、非递归实现&#x1f38a;4、归并排序的性能分析&#x1f38a;5、归并排序的优缺点&#x1f38a;6、归并排序的应用场景&#x1f38a;7、总结 &#x1f38a;1、基本思想 归并排序&…