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.mzph.cn/news/231147.shtml

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

相关文章

【04】GeoScene导出海图或者电子航道图000数据成果

1创建一个带有覆盖面和定义的产品 如果你没有已存在的S-57数据&#xff0c;你可以通过捕捉新的产品覆盖范围&#xff08;多边形产品范围&#xff09;及其所需的产品定义信息&#xff08;产品元数据&#xff09;来为新产品创建基础。 注&#xff1a; 如果你已经有一个S-57数据…

js多图合成一张图

具体思路 先设置画布的宽高&#xff0c;再将每个图片整理成一个对象的数组通过某个方法传出合成后的base64 &#xff08;1&#xff09;、创建一个画布的类&#xff0c;他的属性是canvas虚拟dom和ctx &#xff08;2&#xff09;、构造器初始化convas对象、ctx、convas的宽高 …

【NI-RIO入门】使用LabVIEW进行数据采集测量

于ni kb摘录 选择合适的编程模式 CompactRIO系统具有至少两个用户可选模式。某些CompactRIO型号具有附加的用户可选模式&#xff0c;可以在实时NI-DAQmx中进行编程。请参考本文以判断您的CompactRIO是否能够使用实时NI-DAQmx。将目标添加到项目后&#xff0c;将提示您选择要使…

可以读通讯稿的组数

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 校运动会上&#xff0c;所有参赛同学身上都贴有他的参赛号码。某班参赛同学的号码记于数组 …

【《漫画算法》笔记】位图算法

问题描述 现有一个商店的数据库&#xff0c;它存储了很多顾客的信息&#xff08;如&#xff1a;姓名、年龄、身高、体重、职业等等&#xff0c;总之很多项&#xff09;。 如果想要筛选出“年龄大于25&#xff0c;且身高大于170&#xff0c;且体重大于130&#xff0c;且职业是程…

17、vue3(十七):数据大屏(二):地图效果,折线图效果,柱状图+折线图,散点图,雷达图

目录 一、数据大屏地图效果 1.创建地图、折线图文件夹,引入主页面

wvp-GB28181-pro 2.0+ZLMediaKit 使用Dockerfile制作镜像以及部署【CentOS7】

说明 部署gb28181和zlm主要需要构建两个镜像&#xff0c;第一个为基础镜像&#xff0c;以centos7为基础构建新的基础镜像base.Dockerfile,第二个镜像为服务部署镜像server.Dockerfile&#xff0c;以第一个镜像base.Dockerfile构建出的镜像为基础镜像进行构建 整个基础镜像的构…

Python项目——表白照片墙

1、介绍 利用女神的照片&#xff0c;组成女神的名字&#xff0c;向女神表白。如下图&#xff1a; 原理&#xff1a;获取每个像素点的颜色&#xff0c;白色不贴图&#xff0c;黑色贴图。 2、工具 语言&#xff1a;python3.11编译器&#xff1a;PyCharm包&#xff1a;pygame p…

【html】输入框里按了一下回车,页面就刷新了,怎么解决?

【html】输入框里按了一下回车&#xff0c;页面就刷新了&#xff0c;怎么解决&#xff1f; 表现 form表单里放了个输入框&#xff0c;聚焦输入框后按了回车键&#xff0c;整个页面被刷新了。 在el-form有同样问题 原因 W3C 标准中有如下规定&#xff1a; When there is onl…

2024年【陕西省安全员C证】考试及陕西省安全员C证模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员C证考试是安全生产模拟考试一点通总题库中生成的一套陕西省安全员C证模拟试题&#xff0c;安全生产模拟考试一点通上陕西省安全员C证作业手机同步练习。2024年【陕西省安全员C证】考试及陕西省安全员C证模…

竞赛保研 python+opencv+深度学习实现二维码识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…

HarmonyOS应用开发实战—开箱即用的登录页面2【ArkTS】【鸿蒙专栏-31】

文章目录 一.HarmonyOS应用开发实战—开箱即用的登录页面2【ArkTS】【鸿蒙专栏-31】1.1 项目背景1.2 ArkTS详解二.HarmonyOS应用开发实战—开箱即用的登录页面2【ArkTS】2.1 ArkTS页面源码2.2 代码解析2.3 心得一.HarmonyOS应用开发实战—开箱即用的登录页面2【ArkTS】【鸿蒙专…

VSCode 常用的快捷键和技巧系列(1)

一&#xff1a;常用快捷键 1、编辑器与窗口管理 打开一个新窗口&#xff1a; CtrlShiftN关闭窗口&#xff1a; CtrlShiftW同时打开多个编辑器&#xff08;查看多个文件&#xff09;新建文件 CtrlN文件之间切换 CtrlTab切出一个新的编辑器&#xff08;最多 3 个&#xff09; Ct…

JWT令牌的作用和生成

JWT令牌&#xff08;JSON Web Token&#xff09;是一种用于身份验证和授权的安全令牌。它由三部分组成&#xff1a;头部、载荷和签名。 JWT令牌的作用如下&#xff1a; 身份验证&#xff1a;JWT令牌可以验证用户身份。当用户登录后&#xff0c;服务器会生成一个JWT令牌并返回…

hping3

Hping3 Hping3的介绍&#xff1a; 是一款网络的测试工具&#xff0c;一般用于网络安全员用来进行防火墙的测试等抗压测试。 Hping3的帮助面板: -h –help显示帮助 -v –version显示版本信息 -c –count 限制发包数 -i –interval nterval 指定发包间隔为多少毫秒&#…

一封来自北京软协的感谢信

日前&#xff0c;北京软件和信息服务业协会&#xff08;以下简称北软协&#xff09;向酷雷曼&#xff08;北京同创蓝天云科技有限公司&#xff09;发来感谢信&#xff0c;以表彰和感谢同创蓝天对北软协及行业的全方位支持和卓越贡献。 作为北软协理事会会员单位&#xff0c;酷雷…

js 高阶(含vue.js)

1、主动触发函数 this.$options.watch.watchOrdersFormPrice.apply(this);//主动触发watchOrdersFormPrice watch:{watchOrdersFormPrice: function(){if( !this.ordersForm.alone_sold_price && this.ordersForm.ginfo.goods_id ){var price_info this.ordersForm.…

汽车销售技巧培训应该学习哪些内容

汽车销售技巧培训应该学习哪些内容 随着汽车市场的竞争日益激烈&#xff0c;汽车销售技巧培训对于提高销售人员的销售能力和服务水平至关重要。本文将介绍汽车销售技巧培训应该学习哪些内容&#xff0c;并结合案例进行分析。 一、产品知识 作为销售人员&#xff0c;了解所销售…

Java 图片文件上传下载处理

Java 图片文件上传下载处理 下载 做这玩意给我恶心坏了 下载 直接访问上传的路径就可以下载图片了。但是我们往往会包一层接口&#xff0c;以流的方式读取 url 的内容然后返回给前端&#xff0c;这么做的优点是&#xff1a; 内网域名转外网域名&#xff0c;做业务校验并且让用…

后端相关随机题目记录(1)

目录 后端相关随机题目记录&#xff08;1&#xff09; 后端相关随机题目记录&#xff08;1&#xff09;Bean的类型以及作用域Bean的生命周期Mysql的底层数据结构RedisHttp和Https区别AOP在项目的应用 自定义注解&#xff1f;请求在spring中的一个流程Nacos与zk的区别SpringMV…