面向对象实验 ——(三)数据的保护与共享

简介: 面向对象实验 ——(三)数据的保护与共享

C++静态成员和友元成员的理解

面向对象-数据保护与共享-常模块

写了一节课 极度卑微

一、实验目的及要求

内容:

(1)定义一个具体的类,要求该类中用到类的静态成员和友元;

(2)案例要具有一定的实际功能。

要求:

(1)理解类的静态成员含义,掌握静态成员的适用场合及使用方法;

(2)掌握友元函数及友元类的用法;

(3)记录并分析实验结果,撰写实验报告。

二、实验过程及实验结果分析

1.静态成员

(1)定义

对于一个类来说,函数成员是所有对象都相同的,数据成员则是各自不同的。如果引入一个新的数据成员,对于所有的对象来说,它的值都是相同的,此时如果再去对每一个对象定义一次此数据成员则显得冗杂,由此,我们引入了静态数据成员。

根据上一段话,可以大体得出静态成员的定义:是类共有的数据,类的所有成员都维护这一个数据。

(2)语法:

static int exnum;///静态数据成员

(3)存储

因为静态数据成员是类共有的成员,所以他并不会占用对象的内存空间

更加有关的了解可以看博客


(4)初始化

int A::exnum=0;

“::”是预作用符,表示后面的操作对象属于哪个类。

(5)访问

由于对象具有静态成员访问权,所以我们可以通过对象来访问静态成员

。但是有时候,我们还没有构造对象,这时候就可以直接通过类名来访问静态成员

(6)静态函数的调用

在(5)中我们了解到了有两种访问静态成员的方式,理论上由于静态成员属于类,根据类名直接访问静态成员是可行的,但是由于exnum是私有的数据成员,由于模块的安全性,语法并不支持这种操作。

这时候我们希望某些函数的调用也不依赖于对象,就可以再引进一个静态函数了,与静态数据成员类似,这一函数也是属于类,由类直接调用。

语法定义如下:

20200401134307494.png

代码:

20200401134307494.png

20200401134307494.png

20200401134307494.png

运行结果如下:

构造函数

构造函数

(1,2,3)

(4,5,6)

调用函数功能进行成员的输出

(1,2,3)

sum=21

直接操作进行数据成员的输出

1 2 3 21

sum=21

sum=21

2 .友元函数

(1) 定义

如果一个类允许某外部函数具有其成员函数的权限

即可以直接访问类内成员,那么在该类的定义中应当声明此函数为友元函数

(2)语法

friend double MyDistance( MyPoint& pb,MyPoint& pe);

(3)其他

如果友元函数时全局函数,直接声明即可

但如果该友元函数是某个类中的函数,需要加预作用符说明该函数属于哪一类

(4)友元类

如果想要一个类里的函数都变为另一个类里的友元函数,

可以直接逐个把其变为友元函数,但这样显得过于繁杂,

所以我们也可以将该类变为友元类,语法是先在类前加前向声明,

再在类内定义说明

20200401134307494.png

代码:

20200401134307494.png

20200401134307494.png

20200401134307494.png

3.常模块

(1)定义:

出于数据保护与共享,出现了常模块。顾名思义,常模块就是构造后数据不允许变化的模块。

(2)常数据成员:

常数据成员:在对象构造后其值不会改变,所以必须在构造时对其进行初始化

保护机制:任何的函数都无法修改其值

常函数成员:不允许修改数据成员的一个函数成员

(3)保护机制:

常对象的保护机制:

1.任何函数都无法修改其值

2.常对象调用函数成员时必须保证该函数没有修改常对象的值

(4)函数的调用

由于保护机制,常对象不能调用普通函数

普通对象可以调用常函数,也能调用普通函数,后者优先

(5)常引用

不能通过引用的方式改变对象的值,但是原先的数据是可以改变的

代码:

20200401134307494.png

20200401134307494.png

20200401134307494.png

20200401134307494.png

运行结果:

cnt=0

构造函数

cnt=1

构造函数

cnt=2

析构函数

cnt=1

构造函数

常函数

构造函数

普通函数

析构函数

析构函数

析构函数

4.实验代码:

20200401134307494.png

20200401134307494.png20200401134307494.png

运行结果:


point构造函数

point构造函数

以下为a的信息:

x=1

y=2

以下为b的信息:

x=3

y=4

总共的数据成员之和为10

析构函数

析构函数


过程分析:


先是生成两个point对象a,b

然后打印出a,b的信息

调用友元函数qask_sum函数展现从开始到现在的所有数据成员之和

由于sum是静态数据成员,为类共有,所以sum的值应该是a,b的所有数据成员之和。如果有其他的对象,sum的值应当累加。


目录
相关文章
|
存储 JavaScript 前端开发
掌握这34个知识点,助你快速入门TS
TypeScript现在几乎已经是所有前端程序员必备的技能了,现在的各大框架已经全部采用TS进行开发。本篇文章总结了TS中常用的知识点,希望能对你有所帮助。
1410 0
|
JSON 小程序 前端开发
微信小程序(二十四)微信小程序富文本编辑器editor
{ "component": true, "usingComponents": {} }
417 0
|
Java Linux PHP
15款免费IDE,推荐给开发者
本文为您推荐大量的开源、免费的IDE,精选15个免费IDE,推荐给大家。列表如下: Komodo Edit(Windows, Mac, Linux) Komodo IDE可以在Windows、Mac OS X 和 Linux上运行,并支持通用的开源语言——Perl、PHP和Ruby。
3991 0
|
机器学习/深度学习 分布式计算 算法
【大数据分析&机器学习】分布式机器学习
本文主要介绍分布式机器学习基础知识,并介绍主流的分布式机器学习框架,结合实例介绍一些机器学习算法。
1503 6
|
存储 数据挖掘 索引
Pandas Series 和 DataFrame 常用属性详解及实例
Pandas 是 Python 数据分析的重要工具,其核心数据结构 Series 和 DataFrame 广泛应用。本文详细介绍了这两种结构的常用属性,如 `index`、`values`、`dtype` 等,并通过具体示例帮助读者更好地理解和使用这些属性,提升数据分析效率。
587 4
|
关系型数据库 MySQL 数据库
Mysql数据库联合查询
Mysql数据库联合查询
247 0
|
网络协议 Java Maven
多模块项目使用ElasticSearch报错
多模块项目使用ElasticSearch报错
352 6
|
安全 编译器 C#
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
委托(delegate) 与 事件(event) 🔥 前言🙏 在之前的文章里介绍了C#中的委托(delegate) (Action、Func、Predicate)的基本含义及用法 那本篇文章在这里还要介绍一个跟委托有很大关系的小伙伴——C#中的 事件(event)🎅 事件跟委托是有很大联系的,所以也就导致很容易分不清他们两个,以及什么时候用这两个 上面有博客提到委托,想单独了解委托的可以去看一下,本篇文章主要说一下 什么是事件 🎄 以及 事件与委托的区别🎁
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
|
程序员 Android开发
Android亮度调节的几种实现方法
Android亮度调节的几种实现方法
841 0