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数据…

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

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

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…

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分 该项目较为新颖&…

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…

Unity中URP下的菲涅尔效果实现(个性化修改)

文章目录 前言一、我们修正一下上篇文章中&#xff0c;可能遗留的Bug1、N向量 变为 单位向量2、使颜色范围在合理区间 二、实现菲涅尔效果强弱可自定义调节三、修改菲涅尔效果颜色1、在属性面板定义颜色属性2、在常量缓冲区申明该参数3、在片元着色器中&#xff0c;用颜色和菲涅…

Python---进程

1. 进程的介绍 在Python程序中&#xff0c;想要实现多任务可以使用进程来完成&#xff0c;进程是实现多任务的一种方式。 2. 进程的概念 一个正在运行的程序或者软件就是一个进程&#xff0c;它是操作系统进行资源分配的基本单位&#xff0c;也就是说每启动一个进程&#xf…

QT for Android安卓编译环境搭建+首次编译3个大坑

1、安装 编译环境能否搭建成功&#xff0c;主要是看各个依赖软件的版本是否匹配。依赖的软件有3个&#xff1a;JDK、安卓SDK、安卓NDK。 我的qt版本是5.14.1&#xff0c;我亲测以下版本可以成功让编译安卓&#xff1a; QT5.14 JDK1.8.0 安卓SDK26.1 安卓NDK20.1 在QT-&g…

LeetCode 142. 环形链表 II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整…

【网络安全】-Linux操作系统—操作系统发展历史与Linux

文章目录 操作系统发展历史初期的操作系统分时操作系统个人计算机操作系统 Linux的诞生UNIX与GNU项目Linux内核的创建 Linux的特点开放源代码多样性社区支持 Linux的应用服务器和超级计算机嵌入式系统桌面系统 总结 操作系统发展历史 操作系统&#xff08;Operating System&am…

Linux之FTP 服务器

一、FTP服务器匿名账户服务器配置 1、测试是否已安装vsftp服务器&#xff1a; 2、启动vsftp服务器&#xff1a; 3、修改vsftp主配置文件&#xff0c;允许匿名登录 4、重新启动vsftpd服务,禁用防火墙 5、打开FTP服务的数据文件存放目录/var/ftp&#xff0c;复制若干文件到该目…

Java小案例-RocketMQ的11种消息类型,你知道几种?(死信消息)

前言 在RocketMQ中&#xff0c;死信消息&#xff08;Dead-Letter Message&#xff09;是指那些在正常情况下无法被消费者消费的消息。这些消息会被存储在死信队列&#xff08;Dead-Letter Queue&#xff0c;简称DLQ&#xff09;中。 死信消息的特性包括&#xff1a; 不会再被…