用借书证和时间管理案例轻松掌握C类和对象C中的类和对象是面向对象编程的核心概念但对于初学者来说这些抽象概念往往难以理解。与其死记硬背各种术语不如通过两个贴近生活的案例——借书证和时间管理系统来真正掌握类和对象的精髓。本文将带你从头构建这两个实用小程序在编写代码的过程中理解构造函数、析构函数、成员函数等关键概念。1. 借书证管理系统类的基本结构1.1 设计借书证类借书证是我们日常生活中常见的物品它包含学生信息、借书情况等数据。在C中我们可以将这些数据封装成一个类class BookCard { private: string id; // 学号 string name; // 姓名 int bookCount; // 借书数量 public: BookCard(string id, string name, int count0); 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 h0, int m0, int s0); ~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函数中调用这些函数观察构造函数和析构函数的调用情况。