实验4 静态成员与友元(P281)

匿名 (未验证) 提交于 2019-12-03 00:30:01

实验目的和要求

了解成员函数的特性,掌握静态成员、友元等概念。

实验内容

1.调试下列程序,写出输出结果,并分析输出结果。

  1. usingnamespace
  2. class
  3. public
  4. int
  5. staticvoid
  6. private
  7. int
  8. staticint
  9. void
  10. "A="
  11. "B="
  12. int
  13. int
  14. return
  15. }

输出结果如下图所示:


分析:非静态数据成员从属于某个类,而静态数据成员从属于整个类。执行语句1时调用构造函数,使得对象P、Q的数据成员A的值分别是6和8,因此fun ()中输出数据成员A的值分别是6和8。数据成员B的初始值为100,执行语句1,创建对象P,B的值改变为94,再创建对象Q时,B的值改变为86,因此fun()中输出的数据成员B的值都是86,所以输出结果为A=6 B=86 A=8 B=86。

2.分析并调试程序,完成下列问题。

(1)指出所有的构造函数,它们在本程序中分别起什么作用?

(2)指出设置默认参数的构造函数。

(3)指出友元函数,将友元函数放在私有部分,观察结果是否有变化。

dist()放到私有部分,编译程序发现结果仍然是正确的。这是因为友元函数是一个在类里声明的普通函数,声明位置可在类的任何部位,即可在public区也可在private区和protected区,意义完全一样,因此编译时不会出错。

(4)写出输出结果,并分析输出结果。

  1. #include<iostream>
  2. #include<cmath>
  3. usingnamespace
  4. class
  5. public
  6. double
  7. doubledouble
  8. frienddouble
  9. private
  10. double
  11. double
  12. double
  13. double
  14. return
  15. int
  16. return

输出结果如下:


分析:友元函数dist()的主要作用是求两点之间的距离。

3.定义一个Student类,在该类定义中包括一个数据成员score(分数)、两个静态数据成员total(总分)和学生人数count;成员函数scoretotalcount(float s)用于设置分数、求总分和累计学生人数;静态成员函数sum()用于返回总分;静态成员函数average()用于求平均值。在main()函数中,输入某班同学的成绩,并调用上述函数求全班学生的总分和平均分。(sy4_3.cpp)

编写程序如下:

  1. #include<iostream>
  2. usingnamespace
  3. class
  4. public
  5. voidfloat
  6. staticfloat
  7. staticfloat
  8. private
  9. float
  10. staticfloat
  11. staticint
  12. float
  13. int
  14. voidfloat
  15. floatreturn
  16. floatreturn
  17. int
  18. float
  19. int
  20. "请输入学生的人数:"
  21. "请输入学生成绩:"
  22. for(int
  23. "全班学生的总分为:"
  24. "全班学生的平均分为:"
  25. return

输出结果如下:


4、声明Book与Ruler两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算二者的重量和。(sy4_4.cpp)

编写程序如下:

  1. #include<iostream>
  2. usingnamespace
  3. class
  4. class
  5. public
  6. int
  7. friendint
  8. private
  9. int
  10. class
  11. public
  12. int
  13. friendint
  14. private
  15. int
  16. int
  17. return
  18. int
  19. float
  20. "totalweight:"
  21. return
  22. }

输出结果如下:


分析与讨论

1.如何定义静态数据成员和成员函数?

答:静态成员函数是一种特殊的类成员,在类的许可范围内所有对象共享该数据。静态成员包括静态数据成员和静态成员函数,其定义格式为:static<静态成员的定义>;

2.如何对静态数据成员初始化?

答:静态数据成员的初始化与一般数据成员不同,它的初始化不能在构造函数中进行。静态数据成员初始化的格式为:

<数据类型><类名>::<静态数据成员名>=<初始值>

这里的作用域运算符“::”用来说明静态数据成员所属类。

3.静态成员函数访问静态成员与非静态成员有何区别?

答:由于静态成员函数没有this针,它只能直接访问该类的静态数据成员、静态成员函数和类以外的函数和数据,访问类中的非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名来访问。

4.如何调用静态成员函数?

答:静态成员函数的调用格式为:

<类名>::<静态成员函数>(<参数表>);

<对象名>.<静态成员函数>(<参数表>);

5.如何理解“静态成员不是属于某个对象的,而是属于类的所有对象的。”这句话?

答:从静态成员是指声明为static的类成员,包括静态数据成员和静态成员函数,在类的范围内所有对象共享该数据。

6.比较友元函数与一般函数在定义和调用方面的异同。

答:友元函数的定义与一般函数的定义不同,友元函数的声明在类中,并在前面加上关键字friend;但友元函数的调用形式与一般函数相同。

实验小结

非常的有成就感,还增加了学习的信心。学习的是一个从简单但难,从不懂到懂的过程,只有把基础打好后面的学习才会很轻松。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!