C++共享和保护——(4)保护共享数据

 

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
一滴汗珠万粒粮,万粒汗珠谷满仓!

一起加油!


目录

 一、前言:

二、常对象: 

三、类中的常成员: 

1、常成员函数

🔑说明:

💦例:常成员函数举例。

🔑说明:

2.常数据成员: 

💦例:常数据成员应用举例。

四、常指针:  

💦例:在主函数中定义数组,存放班级学生的分数,定义一个函数统计班级分数平均值。

五、常引用:

💦例:常引用用法。 

六、总结: 

七、共勉:

 


一、前言:

        数据隐藏保证了数据的安全性,但有时我们又需要进行数据共享,各种形式的数据共享对数据的安全性造成了不同程度的破坏。为了既实现数据共享又能保护数据安全,通常我们会考虑以下几种方式: (1)对于既需要共享又不能更改的数据应该声明为常量(2)将数据以及操作数据的函数封装成类,类中的函数可以随意访问类中的数据,从而实现共享。通过设定数据成员为私有或者保护,可以把共享限定在类的内部,对类外的函数来说,数据成员是隐藏的。下面我们主要介绍通过声明常量保护数据。

二、常对象: 

        一个对象被声明为常对象后,其数据成员的值在对象整个生存期内不能被改变。因此,定义常对象时必须对其进行初始化,而且不能被更新。常对象定义格式如下:


const 类型说明符 对象名;


也可以把 const 关键字写在对象名前面,第一种写法更容易被编程人员接受。对于基本数据类型中的常量,C++语法对其提供了保护措施,即必须在定义时进行初始化,初始化后值不能被改变。

        对象不是变量,不能通过简单赋值更新其值。那么,如何保护常对象的值不被改变呢?改变对象的数据成员的值有两种方法:

(1)直接对对象数据成员进行访问赋值,由于限定对象为常对象,常对象的数据成员等同于常量,因此语法会限制其不能被赋值;

(2)通过对象调用类的成员函数,在成员函数中可以对数据成员值进行修改。由于无法确定成员函数是否会修改数据成员,因此只能从语法上限定常对象不能调用普通的成员函数,以防止数据成员在成员函数中被修改。

三、类中的常成员: 

1、常成员函数

        语法上规定常对象不能调用类中的普通成员函数,没有任何对外的接口可以使用,常对象还有什么用处呢? 常成员函数就是专为常对象设计的。也就是说常对象能调用类中的常成员函数。常成员函数声明的格式如下:


类型 函数名(形参表) const;


注意以下几点。

  • ⚡(1)与一般的成员函数不同,常成员函数在函数原型说明及函数定义里,const 关键字都是必不可少的一部分。
  • ⚡(2)C++在语法上规定,常对象只能调用其类中的常成员函数,不能调用其他普通的成员函数,否则在编译时就会出错,通过这个语法限定对常对象进行保护。
  • ⚡(3)C++在语法上规定,在声明为 const类型的成员函数,即常成员函数中,不能更新数据成员的值。
  • ⚡(4)常对象不能调用一般成员函数,常对象可以调用的常成员函数中不能更新数据成员的值。通过这种语法限定可以保证常对象的值在生存期内不会被改变。
  • ⚡(5)类中可以定义两个同名、同形参的成员函数,仅通过关键词 const 进行重载区分。例如在类中声明。

🔑说明:

         语法上限定常对象只能调用常成员函数,但是不限制一般对象调用常成员函数。t果有两个同名的成员函数,一个声明为 const 类型,那么在理论上,一般对象都可以调用这两个成员函数。这会造成两个重载的函数都可以被匹配,此时编译器就会为一般对象选择最合适的重载函数——不带 const 关键字的函数。

💦例:常成员函数举例。

#include<iostream>
using namespace std;
class R{private:int R1,R2;public:R(int r1,int r2):R1(r1),R2(r2){ 	};void display();void dispaly() const;//常成员函数,const可实现函数重载 
};void R::display(){cout<<R1<<"-"<<R2<<endl;
}void R::dispaly()const{cout<<R1<<"+"<<R2<<endl;
}int main(){R a(50,40);//声明普通对象a a.display();//a调用普通成员函数 const R b(30,40);//声明常对象b b.dispaly();//b调用常成员函数 return 0;
}

🔑说明:

        常成员函数不能更新对象的数据成员,也不能调用该类中没有用 const 修饰的普通成员函数;常对象必须被初始化,且不能被更新。常对象只能调用它的常成员函数,而不能调用其他普通成员函数。正因如此,在实际应用中,往往把数据成员不可修改的函数设置为常成员函数,把属性不可修改的对象也设置为常对象。常对象只能调用常成员函数,这种调用方式实现了对数据成员的保护。 

2.常数据成员: 

         也可将类的成员数据声明为常量,使用 const 限定的数据成员为常数据成员。如果一个类中说明了常数据成员,那么任何函数中都不能对该成员赋值。只能在构造函数中对其进行初始化。且常数据成员必须利用构造函数所附带的初始化列表进行初始化而不能在构造函数中直接用赋值语句为其进行赋值。

💦例:常数据成员应用举例。

#include<iostream>
using namespace std;
class A{private:int w,h;const int color;public:A(int x,int y,int c):w(x),h(y){ 	};void display(){cout<<"("<<w<<","<<h<<")"<<"color is :"<<color<<endl;}
}; int main(){A P(20,30,0);P.display();return 0;
}

四、常指针:  

         为了将批量的数据传递给函数,我们通常会将成批的数据存放在数组中,然后将数组名传给函数。函数在得到成批的数据后,就可以进行需要的操作。很多时候我们希望把数据传递给函数使用,同时不希望函数修改数据,以降低引起数据安全问题的风险。

💦例:在主函数中定义数组,存放班级学生的分数,定义一个函数统计班级分数平均值。

#include<iostream>
using namespace std;
float getAverage(float *p,int len){float score=0;for(int i=0;i<len;i++){score+=p[i];}return score/len;
} int main(){float score[10]={89,78,79,87,86,84,95,97,79,80};cout<<getAverage(score,10)<<endl;return 0;
}

 函数如果只有使用数据而无修改数据的必要,而形参类型为指针或引时,一定要将形参声明为常指针或常引用。将 getAverage 形参类型声明为常指针的形式如下:

float getAverage(const float *p,int len);

五、常引用:

         如果在声明引用时用 const 限定,被声明的引用就是常引用。在常引用中被引用的对象不能被更新。与常指针用法类似,常引用主要用来作为形参,通过 const 限定形参后在函数里面就不能意外地发生对实参修改的事件。

💦例:常引用用法。 

#include<iostream>
#include<cmath>
using namespace std;
class Point{private:double x,y;public:Point(double px,double py):x(px),y(py){ 	};friend double dist(const Point& p1,const Point & p2);void display(){cout<<"("<<x<<","<<y<<")"<<endl;}
};double dist(const Point& p1,const Point & p2){double m=p1.x-p2.x;double n=p1.y-p2.y;return sqrt(m*m+n*n);
}int main(){Point p1(4,5),p2(6,8);cout<<"两点:"<<endl;p1.display();p2.display();cout<<"距离为:"<<dist(p1,p2)<<endl;return 0; 
}

六、总结: 

  • 对于既需要共享又不能更改的数据应该声明为常量。
  • 将数据以及操作数据的函数封装成类,类中的函数可以随意访问类中的数据,从而实现共享。
  • 定义常对象时必须对其进行初始化,而且不能被更新。
  • 常对象不能调用普通的成员函数,以防止数据成员在成员函数中被修改。
  • 常成员函数在函数原型说明及函数定义里,const 关键字都是必不可少的一部分。
  • C++在语法上规定,常对象只能调用其类中的常成员函数,不能调用其他普通的成员函数,否则在编译时就会出错,通过这个语法限定对常对象进行保护。
  • C++在语法上规定,在声明为 const类型的成员函数,即常成员函数中,不能更新数据成员的值。
  • 常对象不能调用一般成员函数,常对象可以调用的常成员函数中不能更新数据成员的值。通过这种语法限定可以保证常对象的值在生存期内不会被改变。
  • 类中可以定义两个同名、同形参的成员函数,仅通过关键词 const 进行重载区分。例如在类中声明。

七、共勉:

        以上就是我对C++共享和保护——(4)保护共享数据的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++共享和保护的理解,请持续关注我哦!!! 

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

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

相关文章

探索人工智能中的语言模型:原理、应用与未来发展

导言 语言模型在人工智能领域中扮演着重要的角色&#xff0c;它不仅是自然语言处理的基础&#xff0c;也是许多智能系统的核心。本文将深入研究语言模型的原理、广泛应用以及未来发展趋势。 1. 语言模型的原理 统计语言模型&#xff1a; 基于概率统计的传统语言模型&…

美颜SDK是什么?视频美颜SDK在直播平台中的集成与接入教程详解

当下&#xff0c;主播们追求更加自然、精致的外观&#xff0c;而观众也期待在屏幕前欣赏到更为清晰、美丽的画面。为了满足这一需求&#xff0c;美颜SDK应运而生&#xff0c;成为直播平台的重要利器之一。 一、什么是美颜SDK&#xff1f; 通过美颜SDK&#xff0c;开发者可以…

sensitive-word 敏感词之 DFA 算法(Trie Tree 算法)详解

拓展阅读 敏感词工具实现思路 DFA 算法讲解 敏感词库优化流程 java 如何实现开箱即用的敏感词控台服务&#xff1f; 各大平台连敏感词库都没有的吗&#xff1f; v0.10.0-脏词分类标签初步支持 v0.11.0-敏感词新特性&#xff1a;忽略无意义的字符&#xff0c;词标签字典 …

ELK(九)—logstash

目录 简介安装部署测试 配置详解编写配置文件连接elasticsearch将数据推送到elasticsearch中。 简介 Logstash 是一个开源的服务器端数据处理管道&#xff0c;由 Elastic 公司维护和开发。它被设计用于从不同来源收集、处理和转发数据&#xff0c;以供 Elasticsearch 进行存储…

Linux发行版比较:Ubuntu、CentOS、Red Hat与其他系统的优劣分析

导言 Linux作为开源操作系统&#xff0c;有众多不同的发行版&#xff0c;每个发行版都有其独特的特性和适用场景。本文将聚焦于比较Ubuntu、CentOS、Red Hat和其他系统&#xff0c;深入分析它们的优势、用途以及在不同领域的应用。Linux操作系统的生态系统中&#xff0c;Ubuntu…

cesium学习笔记(问题记录)——(三)

一、根据点跟角度计算另一点坐标&#xff08;三维球体&#xff09; export const getAnotherPoint (lon: number, lat: number, angle: number, distance: number) > {// WGS84坐标系var a 6378137; // 赤道半径var b 6356752.3142; // 短半径var f 1 / 298.257223563;…

redis:六、数据过期删除策略(惰性删除、定期删除)和基于redisson实现的分布式锁(看门狗机制、主从一致性)和面试模板

数据过期删除策略 Redis的过期删除策略&#xff1a;惰性删除 定期删除两种策略进行配合使用 惰性删除 惰性删除&#xff1a;设置该key过期时间后&#xff0c;我们不去管它&#xff0c;当需要该key时&#xff0c;我们在检查其是否过期&#xff0c;如果过期&#xff0c;我们就…

MySQL数据库,触发器、窗口函数、公用表表达式

触发器 触发器是由事件来触发某个操作&#xff08;也包含INSERT、UPDATE、DELECT事件&#xff09;&#xff0c;如果定义了触发程序&#xff0c;当数据库执行这些语句时&#xff0c;就相当于事件发生了&#xff0c;就会自动激发触发器执行相应的操作。 当对数据表中的数据执行…

Redis——多级缓存

JVM进程缓存 为了演示多级缓存&#xff0c;这里先导入一个商品管理的案例&#xff0c;其中包含商品的CRUD功能。将来会给查询商品添加多级缓存。 导入Demo数据 1.安装mysql 后期做数据同步需要用到MySQL的主从功能&#xff0c;所以需要在虚拟机中&#xff0c;利用Docker来运…

任务十六:主备备份型防火墙双机热备

目录 目的 器材 拓扑 步骤 一、基本配置 配置各路由器接口的IP地址【省略】 1、配置BGP协议实现Internet路由器之间互联 2、防火墙FW1和FW2接口IP配置与区域划分 3、配置区域间转发策略 4、配置NAPT和默认路由 5、配置VRRP组&#xff0c;并加入Active/standby VGMP管…

图片转excel:二种合并方式,有何区别?

图片怎么转为可编辑的excel&#xff0c;并且将转换结果合并为一个表&#xff1f;打开眼精星表格文字识别电脑客户端&#xff0c;我们可以看到顶部有一个功能&#xff0c;名为“表格合并”&#xff0c;而在表格识别模块提交选项里&#xff0c;我们会发现有“合并”选项&#xff…

什么是关键词排名蚂蚁SEO

关键词排名是指通过搜索引擎优化&#xff08;SEO&#xff09;技术&#xff0c;将特定的关键词与网站相关联&#xff0c;从而提高网站在搜索引擎中的排名。关键词排名对于网站的流量和用户转化率具有至关重要的影响&#xff0c;因此它是SEO工作中最核心的部分之一。 如何联系蚂…