对象与const

简介: 🐰对象与const🏡常对象🏡常对象成员🌸常数据成员🌸常成员函数🏡指向对象的常指针🏡指向常对象的指针(常量指针)🏡对象的常引用

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰对象与const

🏡常对象

🏡常对象成员

🌸常数据成员

🌸常成员函数

🏡指向对象的常指针

🏡指向常对象的指针(常量指针)

🏡对象的常引用


🐰对象与const

🏡常对象

常对象的数据为常变量且必须要有初值,声明常对象的一般形式为:

1. const 类名 对象名[ 实参表 ];
2. 或者:
3.  类名 const 对象名[ 实参表 ];

如果一个对象被声明为常对象,则不能调用该对象的非const型的成员函数(除了由系统自动调用的隐式的构造函数和析构函数)。

注意:

有时候在编程时有要求,一定要修改常对象中的某个数据成员的值,ANSI C++考虑到实际编程的需要,对此做了特殊处理,将数据成员声明为mutable,如:

mutable int count;

把count声明为可变的数据成员,这样就可以声明为const的成员函数来修改它的值

🏡常对象成员

🌸常数据成员

常数据成员的声明和作用与普通的常变量类似,也是使用const来声明,也是在程序运行过程中数据成员的值不能修改。常变量在声明时同时必须初始化,常数据成员在声明时也必须初始化,常数据成员在初始化时必须使用构造函数的初始化列表。假如将Box类的数据成员length声明为常数据成员,则对length的初始化必须使用构造函数的初始化列表进行,构造函数如下:

1. Box::Box(float L ,float W ,float H):length(L)
2. {
3.     width=W;
4.     height=H;
5. }

🌸常成员函数

常成员函数就是将类中的成员函数声明为const型,这样的成员函数不能修改类对象的数据成员的值,如果在成员函数出现修改数据成员的语句,编译系统在编译时会报错。如果对象声明为常对象,则为保证常对象的数据成员不被修改,通过常对象名只能访问该对象的常成员函数。

声明常成员函数的一般形式:

1. 返回类型 成员函数名(形参表)const;
2. 返回类型 类名 :: 成员函数名(形参表)const;

注:关键字const是函数的一部分,在函数声明和定义部分都必须包含,但在调用时不必加const。

不同类型的成员函数与数据成员之间的访问关系

成员函数分类/数据成员分类

const型成员函数

非const型成员函数

const型数据成员

可以访问,不可修改值

可以访问,不可修改值

非const型数据成员

可以访问,不可修改值

可以访问,可以修改值

常对象数据成员

可以访问,不可修改值

不可以访问,不可以修改值

关于常对象成员最后提出几点注意:

(1)在一个类中可以根据需要将部分数据成员声明为const型数据成员,另一部分数据成员声明为非const型数据成员。const型成员函数和非const成员函数都可以访问这些数据成员,const成员函数不能修改任何的数据成员,非const型成员函数可以访问但不能修改const型数据成员,但可以修改发非const型数据成员。

(2)如果一个类的所有数据成员都不允许修改,可以将这个类中的所有数据成员都声明成const数据成员,或者定义对象时声明为常对象

(3)常对象中的数据成员都是const型数据成员,但是常对象中的成员函数不一定是const型成员函数,只有在成员函数的声明和定义部分有const关键字的才是const成员函数

(4)如果定义了一个常对象,通过该对象名只能调用其const型成员函数。如果一个成员函数没有修改数据成员,但是没有声明为const型成员函数,也不能通过常对象名调用。因此,如果在使用一个类的对象时可能会声明const对象,则在定义类时应该将那些不会修改数据成员的成员函数声明为const型,否则如果该类中没有公用的const型成员函数,则声明了该类的const型成员函数不能调用非const型成员函数

(5)在类的定义中,const型成员函数不能调用非const型成员函数

🏡指向对象的常指针

这个指针不能再指向其他的对象。定义指向对象的常指针的一般形式(指针常量)

类名* const 指针名=&类对象

🏡指向常对象的指针(常量指针)

指向常对象的指针定义

const 类名*指针名

(1)如果一个对象已被声明为常对象,只能使用指向常对象的指针指向它。

(2)如果定义了一个指向常对象的指针,并让它指向非const的对象,则其指向的对象是不能通过指针修改的。但是指向常对象的指针其本身的值是可以修改的

🏡对象的常引用

对象的引用就是对象的别名,对象的引用名和对象名其实都是内存的同一个空间的名字。可以通过引用使用对象,就像通过对象名使用对象一样。引用的一个特点是定义引用时就要给引用初始化。对象的常引用,通过常引用只能调用对象的const成员函数

声明对象的常引用的一般形式:

1. const 类名 &引用名=对象名
2. 如:
3. Clock clock(12,12,12);
4. const Clock &refclock=clock;
5. refclock.display();

display()如果是const成员函数,则合法,若不是const成员函数,则非法。

 

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸


相关文章
|
Cloud Native 关系型数据库 大数据
CockroachDB:云原生数据库的新概念与实践
本文将介绍CockroachDB,一种先进的云原生数据库,它具备分布式、强一致性和高可用性等特点。我们将探讨CockroachDB的基本原理、架构设计以及在实际应用中的种种优势和挑战。
|
4月前
|
jenkins Java 测试技术
|
存储 负载均衡 调度
Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡
Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡
1307 0
|
存储 架构师 数据可视化
一文弄懂数据架构和信息架构的区别
我们经常会听到关于数据架构和信息架构的讨论,它们是一回事吗?让我们看看数据和信息之间的区别,以及组织需要考虑的关键事项。
一文弄懂数据架构和信息架构的区别
|
Linux iOS开发 开发者
Qt问题(二):无法定位程序输入点于动态链接库
动态链接库(Dynamic Link Library,简称DLL)是一种可执行文件格式,常见于Windows操作系统中,而在Linux和macOS等其他操作系统中,相似的概念通常被称为共享库(Shared Library)。动态链接库允许程序在运行时加载所需的代码和数据,而不是在编译时静态链接到应用程序中。这种方式带来了几个重要的优点:
2087 3
|
资源调度 jenkins 持续交付
jenkins 自动安装nodejs16.16.0版本报错处理
jenkins 自动安装nodejs16.16.0版本报错处理
1125 0
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
735 4
|
SQL 存储 NoSQL
贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践
本文投稿自贝壳家装数仓团队,在结合家装业务场景下所探索出的一种基于 Flink+Paimon 的排序方案。这种方案可以在实时环境对全量数据进行准确的分组排序,同时减少对内存资源的消耗。在这一方案中,引入了“事件时间分段”的概念,以避免 Flink State 中冗余数据对排序结果的干扰,在保证排序结果准确性的同时,减少了对内存的消耗。并且基于数据湖组件 Paimon 的聚合模型和 Audit Log 数据在数据湖内构建了拉链表,为排序结果提供了灵活的历史数据基础。
29159 8
贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践
|
设计模式 关系型数据库
设计模式的六大原则:理解设计模式的关键思想和应用
设计模式的六大原则:理解设计模式的关键思想和应用
383 2
|
Kubernetes 应用服务中间件 nginx
K8S部署Metrics-Server服务
K8S部署Metrics-Server服务
340 1