C++入门教程:结构体、枚举与类初探
本文是 C 系列教程的第 5 篇。上一篇讲解了数组、字符串与指针本篇正式进入面向对象世界结构体 struct、枚举 enum/enum class、类 class 的基本语法理解 public/private 访问控制和构造函数初步。一、结构体 struct1.1 结构体的定义与使用结构体是不同类型数据的集合用于描述一个复合对象#includeiostream#includestringusingnamespacestd;// 定义学生结构体structStudent{string name;intage;doublescore;};intmain(){// 定义并初始化Student s1;// 默认构造s1.name张三;s1.age20;s1.score88.5;// 列表初始化C11Student s2{李四,21,92.0};// 访问成员couts1.name s1.age岁 s1.score分endl;couts2.name s2.age岁 s2.score分endl;return0;}1.2 结构体数组#includeiostream#includestringusingnamespacestd;structStudent{string name;intage;doublescore;};intmain(){// 结构体数组Student students[3]{{张三,20,88.5},{李四,21,92.0},{王五,19,76.5}};// 遍历并统计平均分doublesum0;for(constStudents:students){couts.name: s.score分endl;sums.score;}cout平均分: sum/3endl;return0;}1.3 结构体指针与传参#includeiostream#includestringusingnamespacestd;structStudent{string name;intage;};// 用 const 引用避免拷贝voidprintStudent(constStudents){couts.name s.age岁endl;}// 用指针修改结构体voidbirthday(Student*s){s-age;// - 通过指针访问成员}intmain(){Student stu{赵六,22};printStudent(stu);// 赵六 22岁birthday(stu);// 传地址printStudent(stu);// 赵六 23岁// 结构体指针Student*pstu;cout(*p).age (*p).ageendl;// 23coutp-age p-ageendl;// 23return0;}二、枚举 enum2.1 C 风格枚举#includeiostreamusingnamespacestd;// 定义枚举类型enumColor{RED,GREEN,BLUE};// 默认 0, 1, 2enumWeekday{MON1,TUE,WED};// 指定起始 1, 2, 3intmain(){Color cGREEN;coutGREEN GREENendl;// 1coutBLUE BLUEendl;// 2coutTUE TUEendl;// 2// 枚举参与运算隐式转 intintvaluec1;coutvalue valueendl;// 2return0;}2.2 enum classC11推荐#includeiostreamusingnamespacestd;// 强类型枚举必须用 类型::值 访问不能隐式转 intenumclassColor{RED,GREEN,BLUE};enumclassLight{RED,YELLOW,GREEN};intmain(){Color cColor::GREEN;Light lLight::RED;// 类型安全不同枚举类型可同名// int x c; // 错误不能隐式转 intintxstatic_castint(c);// 显式转换coutGREEN xendl;// 1// 可比较同类型if(cColor::GREEN){cout是绿色endl;}return0;}2.3 两种枚举对比维度enumenum class作用域值注入外层命名空间值限定在类型内类型安全可隐式转 int禁止隐式转换同名冲突易冲突可同名推荐程度不推荐推荐三、类 class 初探3.1 类与结构体的关系#includeiostream#includestringusingnamespacestd;// struct 默认成员是 publicstructPoint{intx;inty;};// class 默认成员是 privateclassCircle{public:// 显式声明 publicdoubleradius;doublearea(){// 成员函数return3.14159*radius*radius;}};intmain(){Point p;// struct直接访问p.x10;Circle c;c.radius5;cout面积 c.area()endl;// 78.5398return0;}3.2 完整的类定义#includeiostream#includestringusingnamespacestd;classBankAccount{private:// 私有外部不可直接访问string owner;doublebalance;public:// 公有对外接口// 构造函数对象创建时自动调用BankAccount(string name,doubleinitial){owne rname;balanceinitial;cout账户创建: ownerendl;}// 成员函数方法voiddeposit(doubleamount){if(amount0){balanceamount;cout存入 amount 元endl;}}boolwithdraw(doubleamount){if(amount0amountbalance){balance-amount;cout取出 amount 元endl;returntrue;}cout余额不足endl;returnfalse;}voidshowBalance()const{// const 成员函数不修改对象coutowner 的余额: balance 元endl;}};intmain(){BankAccountacc(小明,1000.0);acc.showBalance();// 小明 的余额: 1000 元acc.deposit(500);acc.showBalance();// 余额: 1500 元acc.withdraw(2000);// 余额不足acc.withdraw(300);// 取出 300 元acc.showBalance();// 余额: 1200 元// acc.balance 0; // 错误private 成员外部不可访问return0;}3.3 访问控制总结访问级别类内派生类外部public可可可protected可可否private可否否封装原则数据成员设为 private通过 public 成员函数访问保护数据安全。四、构造函数与析构函数4.1 构造函数#includeiostreamusingnamespacestd;classRectangle{private:doublewidth;doubleheight;public:// 默认构造Rectangle(){width0;height0;cout默认构造endl;}// 带参构造Rectangle(doublew,doubleh){widthw;heighth;cout带参构造: wxhendl;}// 初始化列表推荐更高效Rectangle(doubleside):width(side),height(side){cout正方形构造endl;}doublearea(){returnwidth*height;}};intmain(){Rectangle r1;// 默认构造Rectangler2(3,4);// 带参构造Rectangler3(5);// 正方形构造coutr1 面积: r1.area()endl;// 0coutr2 面积: r2.area()en dl;// 12coutr3 面积: r3.area()endl;// 25return0;}4.2 析构函数#includeiostreamusingnamespacestd;classResource{public:Resource(){cout资源创建endl;}// 析构函数对象销毁时自动调用用于释放资源~Resource(){cout资源释放endl;}};intmain(){coutmain 开始endl;{Resource res;// 构造cout使用资源...endl;}// 离开作用域析构coutmain 结束endl;return0;}输出顺序main 开始 资源创建 使用资源... 资源释放 main 结束五、实战学生信息登记系统综合本篇知识用结构体 类实现学生登记#includeiostream#includestringusingnamespacestd;// 结构体基础数据structStudent{string name;intage;doublescore;};// 类管理学生集合classStudentManager{private:Student students[100];// 最多 100 人intcount;public:StudentManager():count(0){}voidaddStudent(string name,intage,doublescore){if(count100){cout人数已满endl;return;}students[count]{name,age,score};count;cout已添加: nameendl;}voidprintAll()const{cout 学生名单 endl;for(inti0;icount;i){couti1. students[i].name students[i].age岁 students[i].score分endl;}}doubleaverageScore()const{if(count0)return0;doublesum0;for(inti0;icount;i){sumstudents[i].score;}returnsum/count;}};intmain(){StudentManager manager;manager.addStudent(张三,20,88.5);manager.addStudent(李四,21,92.0);manager.addStudent(王五,19,76.5);manager.printAll();cout平均分: manager.averageScore()endl;return0;}运行示例已添加: 张三 已添加: 李四 已添加: 王五 学生名单 1. 张三 20岁 88.5分 2. 李四 21岁 92分 3. 王五 19岁 76.5分 平均分: 85.6667总结本篇讲解了结构体 struct定义/数组/指针传参、枚举 enum 与 enum class 的区别、类 class 的基本语法成员/方法/访问控制、构造函数与析构函数并用学生信息登记系统串联实战。重点掌握struct 与 class 的区别、enum class 的类型安全、public/private 封装思想、构造与析构时机。下一篇将深入讲解类与对象深拷贝/浅拷贝、static 成员、this 指针、友元敬请期待