C++实验: 对象的赋值与复制
一、实验目的
(1)理解对象的赋值和复制操作的含义,以及由此操作产生的指针悬挂产生的原因。掌握对象的赋值与复制方法。
(2)掌握复制构造函数的定义方法。
(3)了解对象的赋值与复制操作的异同。
二、实验内容
1.声明一个时间类,时间类中有3个私有数据成员(Hour,Minute,Second)和两个公有成员函数(SetTime和PrintTime)。SetTime根据传递的3个参数为对象设置时间;PrintTime负责将对象表示的实践显示输出,输出格式为“Hour:Minute:Second”。
(1)在主函数中,建立一个时间类对象,设置时间为9点20分30秒并显示该时间。
(2)使用构造函数代替上面的SetTime成员函数,并在主函数中使用构造函数设置时间为10点40分50秒,并显示该时间。
(3)重载时间类的构造函数(不带参数)使小时、分、秒均为0。
(4)在时间类的析构函数中输出“Goodbye!”
(5)定义拷贝构造函数并调用。
2.创建一个对象数组,数组的元素是学生对象,学生的信息包括学号、姓名和成绩,在main函数中将数组元素按学生成绩从小到大的顺序进行排序并显示。
三、程序代码
1.
#include<iostream>
using namespace std;
class Time
{
public:
Time()
{
cout << "无参构造函数被调用" << endl;
Hour = 0;
Minute = 0;
Second = 0;
}
Time(int x, int y, int z)
{
cout << "有参构造函数被调用" << endl;
if (x > 23 || x < 0)
cout << "输入错误,小时应为0-23之间" << endl;
else
Hour = x;
if (y > 59 || y < 0)
cout << "输入错误,分钟应为0-59之间" << endl;
else
Minute = y;
if (z > 59 || z < 0)
cout << "输入错误,秒应为0-59之间" << endl;
else
Second = z;
}
void SetTime()
{
cout << "请输入小时:";
cin >> Hour;
cout << "请输入分钟:";
cin >> Minute;
cout << "请输入秒:";
cin >> Second;
}
void PrintTime()
{
cout << "输出时间为:" << Hour << ":" << Minute << ":" << Second << endl;
}
private:
int Hour, Minute, Second; //声明成员Hour,Minute,Second分别表示小时,分钟,秒
};
int main()
{
Time time;
time.SetTime();
cout << "你所输入的时间为:" << endl;
time.PrintTime();
Time T(10, 40, 50);
cout << "构造函数时间为:" << endl;
T.PrintTime();
Time copy = T;
cout << "拷贝构造函数被调用" << endl;
copy.PrintTime();
Time();
cout << "Good bye!" << endl;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/e6bcfce2f00a44f1b5020a209f0e68cd.png)
2.
#include <iostream>
#include <algorithm> // 用于 std::sort
// 定义一个学生类
class Student {
public:
int id; // 学号
std::string name; // 姓名
float score; // 成绩
// 构造函数
Student(int id, std::string name, float score) : id(id), name(name), score(score) {}
// 用于排序的比较函数
static bool compareByScore(const Student& s1, const Student& s2) {
return s1.score < s2.score; // 升序排序
}
};
int main() {
// 创建学生对象数组
Student students[] = {
Student(1, "Alice", 88.5),
Student(2, "Bob", 92.0),
Student(3, "Charlie", 85.5),
Student(4, "David", 91.0)
};
int n = sizeof(students) / sizeof(students[0]); // 计算数组长度
// 使用 std::sort 进行排序,传入比较函数
std::sort(students, students + n, Student::compareByScore);
// 输出排序后的学生信息
for (int i = 0; i < n; i++) {
std::cout << "ID: " << students[i].id
<< ", Name: " << students[i].name
<< ", Score: " << students[i].score << std::endl;
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/0e27500eb0bfd138348a04451c29f73c.png)
四、扩展练习
定义一个点类Point,并定义成员函数doubleDistance(const&Point)求两点的距离。
#include <iostream>
#include <cmath>
using namespace std;
class Point {
private:
double x, y; // 点的 x 和 y 坐标
public:
Point(double x = 0.0, double y = 0.0) : x(x), y(y) {}
double doubleDistance(const Point& p) const {
return std::sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
}
};
int main() {
Point p1(4, 0), p2(3, 4);
double distance = p1.doubleDistance(p2);
std::cout << "两点的距离为: " << distance << std::endl;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/53b2087d2ded5d7691255f575d357287.png)