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++共享和保护的理解,请持续关注我哦!!! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.5 DataFrame.rolling()创建滚动窗口对象

DataFrame.rolling创建滚动窗口对象 一、介绍二、代码一、介绍 DataFrame.rolling() 是 pandas 中用于创建滚动窗口对象的函数,它可以对时间序列或其他类型的数据进行滚动计算。下面是该函数的一些参数说明: DataFrame.rolling(window, min_periods=None, center=False, win_…

59. 螺旋矩阵 II(java实现,史上最详细教程,想学会的进!!!)

今天来分享一下螺旋矩阵的解题思路及代码的实现。 题目描述如下&#xff1a; 首先拿到这道题&#xff0c;首先不要慌张&#xff0c;我们来仔细分析一下会发现并没有那么难。 首先看下边界的元素是1、2、3递增的&#xff0c;那么我们也许可以根据这一点先把边界的元素一个一个给…

Discord Midjourney 安装使⽤教程(AI绘画)

安装步骤: 1.注册Discord账号 2.进⼊Midjourney社区创作 3.创建⾃⼰服务器 安装教程: 1.注册Discord账号 账号注册的方式&#xff1a; 注册地址: //账号注册地址https://discord.com/ 2.进⼊Midjourney社区创作 // 邀请链接: 官方的midjourneyhttps://discord.gg/midjo…

4.docker镜像及相关命令

目录 1 查看所有镜像 docker images 1.1 基本用法 1.2 docker images -q 只显示所有镜像ID 1.3 docker images -f [筛选条件] -q 只显示符合条件的所有镜像ID 1.4 docker images --no-trunc 显示完整的IMAGE ID 1.5 docker images --format [模板] 使用模板 2 从…

玩转Docker(六):数据挂载与共享

文章目录 〇、Docker的两种存放数据的资源1.Storage Driver2.Data Volume3.使用场景 一、使用Data Volume1.-v <host_path>:<container_path>2.-v <container_path>挂载匿名卷 二、数据共享1.容器和主机之间共享2.容器之间共享(1)方法一&#xff1a;-v非匿名…

Mysql之Specified key was too long; max key length is xx bytes异常

问题原因&#xff1a;mysq索引的字段都太长了 767字节是 MySQL 版本5.6(以及以前版本)中 InnoDB 表的最大索引前缀长度限制&#xff0c;MyISAM 表的长度为1,000字节。在 MySQL 版本5.7及以上版本中&#xff0c;这个限制增加到了3072字节。 如果对 utf8mb4编码的 varchar 字段设…

第七节JavaScript Promise

一、JavaScript Promise 1、简介 Promise是一个ES6提供的类&#xff0c;目的是更加优雅地书写复杂的异步任务。 由于Promise是ES6新增的&#xff0c;所以一些旧的浏览器并不支持&#xff0c;苹果的Safari 10和Windows的Edge 14版本以上的浏览器才支持&#xff0c;这个需要注…

[AutoSar]基础部分 RTE 02 S/R Port 显式/隐式

目录 关键词平台说明一、显式&#xff08;Explicit&#xff09;和隐式&#xff08;Implicit&#xff09;1.1 显式模式1.1.1code 二、隐式模式2.1 code 三、区别 关键词 嵌入式、C语言、autosar、EcuM、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语…

Content-Type是什么

目录 Content-Type是什么 获取方式 设置方式 常见类型 application/x-www-form-urlencoded multipart/form-data application/json text/xml text/html text/plain Content-Type是什么 Content-Type出现在请求标头和响应标头中&#xff0c;意思是内容类型&#xff0…

Ubuntu如何安装KVM

环境&#xff1a; 联想E14笔记本 Ubuntu20.04 问题描述&#xff1a; Ubuntu如何安装KVM 解决方案&#xff1a; 1.验证CPU是否支持硬件虚拟化 rootst-ThinkPad-E14:~# grep -Eoc (vmx|svm) /proc/cpuinfo 162.检查 VT 是否在 BIOS 中启用 安装 apt install cpu-checker …

论文阅读——Painter

Images Speak in Images: A Generalist Painter for In-Context Visual Learning GitHub - baaivision/Painter: Painter & SegGPT Series: Vision Foundation Models from BAAI 可以做什么&#xff1a; 输入和输出都是图片&#xff0c;并且不同人物输出的图片格式相同&a…

隐私计算介绍

这里只对隐私计算做一些概念性的浅显介绍&#xff0c;作为入门了解即可 目录 隐私计算概述隐私计算概念隐私计算背景国外各个国家和地区纷纷出台了围绕数据使用和保护的公共政策国内近年来也出台了数据安全、隐私和使用相关的政策法规 隐私计算技术发展 隐私计算技术安全多方计…

滴滴出行:驾龄不到一年有什么办法注册网约车?

驾龄不到一年有什么办法注册网约车&#xff1f;怎么解决网约车注册审核问题。我可以为您提供一些对于如何注册滴滴快车的信息。要注册为滴滴快车司机&#xff0c;你需要符合下列规范&#xff1a; 1.年龄在12-60岁左右&#xff0c;有C1或以上驾照&#xff0c;如果驾龄不够三年是…

JVM 垃圾回收详解

前言 什么是垃圾? 垃圾是指运行程序中没有任何引用指向的对象&#xff0c;需要被回收。 内存溢出和内存泄漏 内存溢出&#xff1a;经过垃圾回收之后&#xff0c;内存仍旧无法存储新创建的对象&#xff0c;内存不够溢出。 内存泄漏&#xff1a;又叫“存储泄漏”&#xff0…

【Leetcode】旋转矩阵

题目链接&#xff1a;https://leetcode.cn/problems/rotate-matrix-lcci/description/ 题目描述 给你一幅由 N N 矩阵表示的图像&#xff0c;其中每个像素的大小为 4 字节。请你设计一种算法&#xff0c;将图像旋转 90 度。 不占用额外内存空间能否做到&#xff1f; 示例 …

cefsharp120.1.8(cef120.1.8,Chromium120.0.6099.109)版本升级测试,其他版本H264版本

此版本最新版cef120.1.8,Chromium120.0.6099.109 此更新包括一个高优先级安全更新 This update includes a high priority security update. 说明&#xff1a;本版本暂时不支持264&#xff0c;其他H264版本参考119,116&#xff0c;114&#xff0c;110&#xff0c;109等版本 c…

mysql innodb知识记录

官方文档 官网架构图 innodb 特性 内存 buffer pool 采用优化后的LRU算法&#xff0c; 3/8 of the buffer pool is devoted to the old sublist.The midpoint of the list is the boundary where the tail of the new sublist meets the head of the old sublist.When In…

地牢边缘 DUNGEON LIMBUS中文免安装版

​《地牢边缘》是一款点阵图形式的像素风经典迷宫探索类游戏。玩家需要在游戏中收集多种装备&#xff0c;随机生成的无限地下城。在生死之际遇见的迷之铁匠和管理复活之村的年轻女性。为了找回遗失的记忆&#xff0c;进入更深的地下城。玩家还可以发展村落以及进化武器的多样化…

亚信安慧AntDB数据库助力智慧高速建设

随着新型智慧交通业务的迅速发展&#xff0c;各地高速公路在管控、收费和监测方面的数据管理变得至关重要。智慧公路信息化建设已成为高速公路建设的核心。AntDB数据库在某省级客户中发挥关键作用&#xff0c;帮助构建协同共享、高效的统一智慧管理平台&#xff0c;为高速公路的…

javascript 数组处理的两个利器: `forEach` 和 `map`(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…