C++高级程序设计实验报告三:类和对象—构造函数与析构函数
实验三类和对象—构造函数与析构函数:
1.理解掌握this指针的作用和用法;
2.理解掌握构造函数的定义和作用;
3.掌握构造函数的使用;
4.理解掌握拷贝构造函数的定义和使用;
5.理解掌握构造函数的重载;
6.理解掌握析构函数的定义和使用。
### C++高级程序设计实验三-类和对象构造函数与析构函数
#### 实验目的与内容概述
本次实验旨在加深对C++中类和对象的理解,特别是构造函数与析构函数的应用。实验包含了以下几个主要目标:
1. **理解掌握 this 指针的作用和用法**:`this`指针是每个非静态成员函数中的隐含指针,它指向调用该成员函数的对象。正确使用`this`指针能够解决成员变量与局部变量同名带来的问题。
2. **理解掌握构造函数的定义和作用**:构造函数是在创建对象时自动调用的特殊成员函数,用于初始化对象的数据成员。
3. **掌握构造函数的使用**:了解如何定义不同类型的构造函数,包括默认构造函数、带参数的构造函数和拷贝构造函数。
4. **理解掌握拷贝构造函数的定义和使用**:拷贝构造函数用于创建对象时以现有对象作为初始化来源,确保对象之间的独立性。
5. **理解掌握构造函数的重载**:通过重载构造函数,可以根据不同的初始化需求使用不同的参数列表。
6. **理解掌握析构函数的定义和使用**:析构函数是在对象生命周期结束时自动调用的特殊成员函数,用于释放对象占用的资源。
#### 实验内容详解
##### 程序阅读分析
**问题一**:程序可以编译通过。但存在一个问题:当参数与成员变量名相同时,直接使用`x=x`及`y=y`会导致编译器无法区分这两个同名的变量。应使用`this->x=x;`和`this->y=y;`来明确指出成员变量。
**问题二**:程序存在逻辑错误,修改如下:
```cpp
#include <iostream>
using namespace std;
class CPerson {
public:
void Print();
CPerson(int _age, char *_name);
private:
int age;
char *name;
};
// 构造函数定义
CPerson::CPerson(int _age, char *_name) {
age = _age;
name = new char[strlen(_name) + 1]; // 动态分配内存
strcpy(name, _name);
}
void CPerson::Print() {
cout << "name=" << name << ",age=" << age << endl;
}
int main() {
CPerson ps(23, "张三");
ps.Print();
return 0;
}
```
这里添加了动态内存分配,并使用`strcpy`复制字符串到动态分配的内存中。
##### 程序设计
**设计实现一个CPoint类**
- **定义**:`CPoint`类包含两个整型成员变量`_x`(横坐标)和`_y`(纵坐标)。类中包含输出函数`Print()`,不允许直接访问成员变量。
- **构造函数**:
- 默认构造函数:`CPoint(int xx=0, int yy=0):_x(xx),_y(yy){}`。默认值为0。
- 拷贝构造函数:`CPoint(const CPoint &a)`,用于对象的深拷贝。
- **示例代码**:
```cpp
#include <iostream>
using namespace std;
class CPoint {
public:
void Print();
CPoint(int xx = 0, int yy = 0):_x(xx),_y(yy){}
CPoint(const CPoint &a);
int getX() { return _x; }
int getY() { return _y; }
private:
int _x;
int _y;
};
void CPoint::Print() {
cout << "_x=" << _x << ",_y=" << _y << endl;
}
CPoint::CPoint(const CPoint &a) {
_x = a._x;
_y = a._y;
}
int main() {
CPoint a;
a.Print();
CPoint b(1, 2);
b.Print();
a = b;
a.Print();
return 0;
}
```
##### 思考题
**设计一个CStudent(学生)类**
- **成员变量**:学生姓名、学号、程序设计、信号处理、数据结构三门课程的成绩。
- **成员函数**:
- `input()`:用于输入学生信息。
- `display()`:用于输出学生信息。
- `mean(int y)`:用于计算平均成绩。
**示例代码**:
```cpp
#include <iostream>
#include <string>
using namespace std;
class Student {
private:
static double sum;
string name, sex, number;
int year;
double result;
public:
Student();
~Student(){};
void input();
void display();
void mean(int y);
};
// 静态成员变量的定义
double Student::sum = 0.0;
Student::Student() {
name = "no name";
sex = "no";
number = "0";
year = 0;
result = 0;
}
void Student::input() {
cout << "请输入学生信息:" << endl;
cout << "姓名:";
cin >> name;
cout << "性别:";
cin >> sex;
cout << "学号:";
cin >> number;
cout << "年龄:";
cin >> year;
cout << "成绩:";
for (int i = 0; i < y; i++) {
double score;
cin >> score;
sum += score;
}
result = sum / y;
}
void Student::display() {
cout << "姓名:" << name << endl;
cout << "性别:" << sex << endl;
cout << "学号:" << number << endl;
cout << "年龄:" << year << endl;
cout << "平均成绩:" << result << endl;
}
void Student::mean(int y) {
sum = 0;
for (int i = 0; i < y; i++) {
double score;
cin >> score;
sum += score;
}
result = sum / y;
}
int main() {
// 示例:创建并使用对象
Student s1;
s1.input();
s1.display();
return 0;
}
```
此段代码实现了学生类的设计要求,包括输入输出学生信息、计算平均成绩等功能。通过以上实验,我们可以深入理解和实践C++中类和对象的相关概念。