C++静态成员和友元成员的理解
面向对象-数据保护与共享-常模块
写了一节课 极度卑微
一、实验目的及要求
内容:
(1)定义一个具体的类,要求该类中用到类的静态成员和友元;
(2)案例要具有一定的实际功能。
要求:
(1)理解类的静态成员含义,掌握静态成员的适用场合及使用方法;
(2)掌握友元函数及友元类的用法;
(3)记录并分析实验结果,撰写实验报告。
二、实验过程及实验结果分析
1.静态成员
(1)定义
对于一个类来说,函数成员是所有对象都相同的,数据成员则是各自不同的。如果引入一个新的数据成员,对于所有的对象来说,它的值都是相同的,此时如果再去对每一个对象定义一次此数据成员则显得冗杂,由此,我们引入了静态数据成员。
根据上一段话,可以大体得出静态成员的定义:是类共有的数据,类的所有成员都维护这一个数据。
(2)语法:
static int exnum;///静态数据成员
(3)存储
因为静态数据成员是类共有的成员,所以他并不会占用对象的内存空间
更加有关的了解可以看博客
(4)初始化
int A::exnum=0;
“::”是预作用符,表示后面的操作对象属于哪个类。
(5)访问
由于对象具有静态成员访问权,所以我们可以通过对象来访问静态成员
。但是有时候,我们还没有构造对象,这时候就可以直接通过类名来访问静态成员
(6)静态函数的调用
在(5)中我们了解到了有两种访问静态成员的方式,理论上由于静态成员属于类,根据类名直接访问静态成员是可行的,但是由于exnum是私有的数据成员,由于模块的安全性,语法并不支持这种操作。
这时候我们希望某些函数的调用也不依赖于对象,就可以再引进一个静态函数了,与静态数据成员类似,这一函数也是属于类,由类直接调用。
语法定义如下:
代码:
运行结果如下:
构造函数
构造函数
(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)友元类
如果想要一个类里的函数都变为另一个类里的友元函数,
可以直接逐个把其变为友元函数,但这样显得过于繁杂,
所以我们也可以将该类变为友元类,语法是先在类前加前向声明,
再在类内定义说明
代码:
3.常模块
(1)定义:
出于数据保护与共享,出现了常模块。顾名思义,常模块就是构造后数据不允许变化的模块。
(2)常数据成员:
常数据成员:在对象构造后其值不会改变,所以必须在构造时对其进行初始化
保护机制:任何的函数都无法修改其值
常函数成员:不允许修改数据成员的一个函数成员
(3)保护机制:
常对象的保护机制:
1.任何函数都无法修改其值
2.常对象调用函数成员时必须保证该函数没有修改常对象的值
(4)函数的调用
由于保护机制,常对象不能调用普通函数
普通对象可以调用常函数,也能调用普通函数,后者优先
(5)常引用
不能通过引用的方式改变对象的值,但是原先的数据是可以改变的
代码:
运行结果:
cnt=0
构造函数
cnt=1
构造函数
cnt=2
析构函数
cnt=1
构造函数
常函数
构造函数
普通函数
析构函数
析构函数
析构函数
4.实验代码:
运行结果:
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的值应当累加。