目录
1. 掌握类和对象的定义,并能通过对象调用成员函数完成简单的程序设计。
一、 实验目的和要求
1. 掌握类和对象的定义,并能通过对象调用成员函数完成简单的程序设计。
- 类(Class):类是对具有相同属性和行为的对象的抽象描述。它是一个模板或蓝图,定义了对象的属性和行为,包括变量和方法。类是抽象的,不占用内存,用于创建对象的实例。类可以看作是一个数据类型,通过实例化可以创建多个对象。
- 对象(Object):对象是类的一个实例,是具体存在的。它具有类定义的属性和行为,可以通过类来创建对象。对象是具体的,占用存储空间,并且是实实在在存在的东西。
2. 初步掌握用类和对象编写基于对象的程序。
3. 掌握在构造函数中用初始化列表为常成员变量初始化值。
在C++中,类的构造函数用于初始化类的对象。构造函数可以有两种方式来初始化类的成员变量:通过构造函数初始化列表或通过构造函数的函数体。对于常量成员变量或引用成员变量,必须在构造函数初始化列表中进行初始化,而不能在构造函数的函数体中进行。这是因为常量或引用成员变量的值在编译时就已经确定,无法在运行时改变,因此它们的初始化必须在构造函数执行之前完成。
构造函数初始化列表的语法是类名后跟一个冒号和初始化列表,每个成员变量或常量成员变量的初始化值用逗号分隔。例如,如果一个类有一个常量成员变量和一个引用成员变量,以及一个普通成员变量,那么必须使用构造函数初始化列表来初始化常量成员变量和引用成员变量。例如:
class myClass{
public:
int i;
const int ci; // 常量成员变量
int& ri; // 引用成员变量
myClass(int value) : i(value), ci(value), ri(i) {} // 使用构造函数初始化列表来初始化所有成员变量
};
在这个例子中,ci是一个常量成员变量,它的值在对象创建时就已经确定,并且之后不能被修改。ri是一个引用成员变量,它引用了另一个对象或变量,这个引用在对象创建时就已经被绑定,之后不能更改。因此,这两个成员变量必须在构造函数初始化列表中进行初始化。
使用构造函数初始化列表来初始化成员变量有几个优点:
- 效率:初始化列表中的初始化通常比在构造函数体中的初始化更高效,因为它避免了函数调用的开销。
- 安全性:对于常量或引用成员变量,必须在构造函数初始化列表中初始化,否则编译器会报错。这确保了这些特殊类型的成员变量能够正确地被初始化。
- 推荐做法:虽然可以在构造函数的函数体中初始化所有成员变量,但使用初始化列表是更推荐的做法,因为它效率更高,且能保证成员变量的正确初始化12。
4. 理解构造函数和析构函数的运行结果和执行时机。
二、 实验内容与结果
实验一
1. 程序功能:
圆形花园喷泉水池如图所示,为了安全现在需在水池四周围上一圈栅栏,并建设一个圆形过道。栅栏造价为120元/m,过道造价为150元/m2。过道宽度为3m,现在给出水池半径要求编程计算栅栏和过道的造价。请使用“类”实现来实现这一功能,圆周率定义为常数据成员PI=3.14159,使用构造函数为水池的半径赋初值10,造价输出部分请使用类的成员函数来实现。

2. 关键程序代码:
1.#include <iostream>
2.using namespace std;
3.const double PI = 3.14159;
4.class Box {
5. public:
6. double n, zl, gd;
7. void seta(double ab) {
8. n = ab;
9. }
10. void getvolume() {
11. zl = n * 2 * PI * 120;
12. }
13. void getarea() {
14. double m = n + 3;
15. gd = (m * m * PI - n * n * PI) * 150;
16. }
17. void disp() {
18. cout << "栅栏的造价为" << zl << endl;
19. cout << "过道的造价为" << gd << endl;
20. cout<<"栅栏和过道的总共造价为"<<zl+gd<<endl;
21. }
22.};
23.int main() {
24. int ab = 10;
25. Box obj;
26. obj.seta(ab);
27. obj.getvolume();
28. obj.getarea();
29. obj.disp();
30. return 0;
31.}
实验二
1. 程序功能:
设计一个做加减乘除基本运算的类,通过加减乘除4个成员函数输出结果。在主函数中创建对象时使用两个值进行初始化,初始化方式不限,通过成员函数输出相应的计算结果。要求:初始化后的两个值必须为私有。
2. 关键程序代码:
1.#include <iostream>
2.using namespace std;
3.class oper {
4. private:
5. double x, y;
6. char z;
7. public:
8. oper(double a, double b, char c ) {
9. x = a;
10. y = b;
11. z = c;
12. }
13.
14. void opera () {
15. switch (z) {
16. case '+':
17. cout << "两数之和为" << x + y << endl;
18. break;
19. case '-':
20. cout << "两数之差为" << x - y << endl;
21. break;
22. case '*':
23. cout << "两数之积为" << x*y << endl;
24. break;
25. case '/':
26. if (y == 0) {
27. cout << "运算错误,除数不能为零" << endl;
28. break;
29. } else {
30. cout << "两数之商为" << x / y << endl;
31. break;
32. }
33. default:
34. cout << "不能运算" << endl;
35. }
36. }
37.};
38.int main() {
39. double a, b;
40. char c;
41. cout << "分别输入运算量和运算符" << endl;
42. cin >> a >> b >> c;
43. oper B(15, 0, '/');
44. B.opera();
45. return 0;
46.}
实验三
1. 程序功能:
设计一个简单的类,手动定义一个构造函数,用于区分实数或者带虚部的复数。要求:1. 使用构造函数赋初值,输入1个参数或者第2个参数为0时判断为实数,输入2个参数且第2个不为0时为带虚部的复数;2. 构造函数内根据判断结果,分别输出“这是一个实数。”和“这是一个带虚部的复数,其模为***”。
2. 关键程序代码:
1.#include <iostream>
2.#include <math.h>
3.using namespace std;
4.class complex {
5. private:
6. double real, imag;
7. public:
8. complex(double r, double i) {
9. real = r;
10. imag = i;
11. }
12.
13. void oer() {
14. if (imag == 0) {
15. cout << "这是实数。" << endl;
16. } else {
17. double m;
18. m = sqrt(real * real + imag * imag);
19. cout << "这是一个带虚部的复数,其模为" << m << endl;
20. }
21. }
22.};
23.int main() {
24. double r, i;
25. cin >> r >> i;
26. complex C(r, i);
27. C.oer();
28. return 0;
29.}
实验四
1. 程序功能:
请手动将以下代码输入进编译器中,并将其中的“XXX”替换成自己的名字(汉字),观察析构函数的执行顺序,并将运行结果截图到指定位置。
2. 关键程序代码:
1.#include<iostream>
2.using namespace std;
3.class test
4.{
5. string name;
6. int year;
7. public:
8. test(string name, int year = 2023): name(name), year(year)
9. {
10. cout << name << year << "年开始学习《C++语言程序设计》" << endl;
11. }
12. ~test()
13. {
14. if (year < 2023)
15. cout << name << "取得了不错的成绩。\n";
16. else
17. cout << name << "希望能取得好成绩。\n";
18. }
19.};
20.
21.int main()
22.{
23. test *stu1 = new test("小明", 2022);
24. delete stu1;
25. test stu2("XXX");
26. return 0;
27.}
962

被折叠的 条评论
为什么被折叠?



