别再死记硬背C++类和对象了!用‘借书证’和‘时间’两个实战案例帮你彻底搞懂(附完整代码)
用借书证和时间管理案例轻松掌握C++类和对象
C++中的类和对象是面向对象编程的核心概念,但对于初学者来说,这些抽象概念往往难以理解。与其死记硬背各种术语,不如通过两个贴近生活的案例——借书证和时间管理系统,来真正掌握类和对象的精髓。本文将带你从头构建这两个实用小程序,在编写代码的过程中理解构造函数、析构函数、成员函数等关键概念。
1. 借书证管理系统:类的基本结构
1.1 设计借书证类
借书证是我们日常生活中常见的物品,它包含学生信息、借书情况等数据。在C++中,我们可以将这些数据封装成一个类:
class BookCard { private: string id; // 学号 string name; // 姓名 int bookCount; // 借书数量 public: BookCard(string id="", string name="", int count=0); void display(); bool borrow(); };这个类有三个私有数据成员:学号、姓名和借书数量。私有成员只能在类内部访问,外部需要通过公有成员函数来操作这些数据。
1.2 实现成员函数
构造函数用于初始化对象的数据成员,我们可以使用初始化列表来简化代码:
BookCard::BookCard(string id, string name, int count) : id(id), name(name), bookCount(count) {}显示借书证信息的成员函数实现如下:
void BookCard::display() { cout << "学号:" << id << "\n姓名:" << name << "\n借书数量:" << bookCount << endl; }借书功能需要考虑借书数量限制,最多借10本:
bool BookCard::borrow() { if(bookCount >= 10) { cout << "借书已达上限10本" << endl; return false; } bookCount++; return true; }1.3 使用借书证类
在main函数中,我们可以创建多个借书证对象并测试功能:
int main() { BookCard card1("B20230001", "张三", 5); BookCard card2("B20230002", "李四", 10); card1.display(); card1.borrow(); card1.display(); card2.display(); card2.borrow(); return 0; }运行结果会显示借书证信息,并验证借书功能是否正常工作。
2. 时间管理系统:深入理解类特性
2.1 设计时间类
时间类需要存储小时、分钟、秒等信息,并提供修改和显示功能:
class Time { private: int hour; int minute; int second; public: Time(int h=0, int m=0, int s=0); ~Time(); void setTime(int h, int m, int s); void showTime(); void increaseSecond(); };2.2 实现时间类功能
构造函数和析构函数实现如下:
Time::Time(int h, int m, int s) { hour = h; minute = m; second = s; cout << "时间对象已创建" << endl; } Time::~Time() { cout << "时间对象已销毁" << endl; }增加秒数的功能需要考虑进位情况:
void Time::increaseSecond() { second++; if(second >= 60) { second = 0; minute++; if(minute >= 60) { minute = 0; hour++; if(hour >= 24) { hour = 0; } } } }2.3 测试时间类
在main函数中测试时间类功能:
int main() { Time t(23,59,59); t.showTime(); t.increaseSecond(); t.showTime(); Time t2(12,30,45); t2.showTime(); return 0; }运行结果会显示时间变化,特别是23:59:59增加1秒后变为00:00:00的情况。
3. 友元函数与友元类:打破封装限制
###3.1 友元函数的使用
友元函数可以访问类的私有成员,但又不属于类的成员函数。我们可以修改时间类,添加友元函数:
class Time { friend void printTime(Time t); // 其他成员... }; void printTime(Time t) { cout << t.hour << ":" << t.minute << ":" << t.second << endl; }###3.2 友元类的应用
友元类可以访问另一个类的私有成员。例如,我们可以定义一个学生类和一个成绩类:
class Student { friend class Grade; private: string name; int score; public: Student(string n, int s) : name(n), score(s) {} }; class Grade { public: void showStudent(Student s) { cout << "姓名:" << s.name << "\n成绩:" << s.score << endl; } };##4. 对象拷贝与引用传递
###4.1 拷贝构造函数
拷贝构造函数用于对象初始化时复制另一个对象的内容:
class Time { public: Time(const Time& t) { hour = t.hour; minute = t.minute; second = t.second; } // 其他成员... };###4.2 引用传递与指针传递
引用传递和指针传递可以避免对象拷贝,提高效率:
void showTime(Time& t) { t.showTime(); } void showTime(Time* t) { t->showTime(); }在main函数中调用这些函数,观察构造函数和析构函数的调用情况。
