0
点赞
收藏
分享

微信扫一扫

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


​​C++静态成员和友元成员的理解​​​​面向对象-数据保护与共享-常模块​​ 写了一节课 极度卑微

一、实验目的及要求

内容:
(1)定义一个具体的类,要求该类中用到类的静态成员和友元;
(2)案例要具有一定的实际功能。
要求:
(1)理解类的静态成员含义,掌握静态成员的适用场合及使用方法;
(2)掌握友元函数及友元类的用法;
(3)记录并分析实验结果,撰写实验报告。

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

1.静态成员

(1)定义
对于一个类来说,函数成员是所有对象都相同的,数据成员则是各自不同的。如果引入一个新的数据成员,对于所有的对象来说,它的值都是相同的,此时如果再去对每一个对象定义一次此数据成员则显得冗杂,由此,我们引入了静态数据成员。
根据上一段话,可以大体得出静态成员的定义:是类共有的数据,类的所有成员都维护这一个数据。
(2)语法:
static int exnum;///静态数据成员
(3)存储
因为静态数据成员是类共有的成员,所以他并不会占用对象的内存空间
更加有关的了解可以看​​​博客​​

(4)初始化

int A::exnum=0;

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

(5)访问

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

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

(6)静态函数的调用

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

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

语法定义如下:

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


代码:

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


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


面向对象实验 ——(三)数据的保护与共享_构造函数_04


运行结果如下:

构造函数

构造函数

(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)友元类

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

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

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

再在类内定义说明

面向对象实验 ——(三)数据的保护与共享_构造函数_05

代码:

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


面向对象实验 ——(三)数据的保护与共享_构造函数_07


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

3.常模块

(1)定义:

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

(2)常数据成员:

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

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

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

(3)保护机制:

常对象的保护机制:

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

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

(4)函数的调用

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

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

(5)常引用

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

代码:

面向对象实验 ——(三)数据的保护与共享_静态成员_09


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


面向对象实验 ——(三)数据的保护与共享_静态成员_11


面向对象实验 ——(三)数据的保护与共享_静态成员_12

运行结果:

cnt=0
构造函数
cnt=1
构造函数
cnt=2
析构函数
cnt=1
构造函数
常函数
构造函数
普通函数
析构函数
析构函数
析构函数

4.实验代码:

面向对象实验 ——(三)数据的保护与共享_构造函数_13


面向对象实验 ——(三)数据的保护与共享_构造函数_14


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

运行结果:

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的值应当累加。


举报

相关推荐

0 条评论