C++核心编程 4 类和对象-封装
C++面向对象的三大特性:封装、继承、多态
C++认为万事万物皆为对象,对象上有其属性和行为
封装
意义:1、将属性和行为作为一个整体,表现生活中的事物
语法: class 类名{ 访问权限:属性 / 行为 };
实例:设计一个圆类,求圆的周长
#include<iostream> #include<string> using namespace std; //设计一个圆类,求圆的周长 //圆周长公式:2 * pai * 半径 const double pai = 3.14; //圆周率 //class设计一个类,类后面紧跟着的就是类名称 class Circle { public: //访问权限 公共权限 int m_r; //属性 半径 double calculateZC() //行为 获取圆的周长 { return 2 * pai * m_r; //返回圆的周长 } }; int main() { //实例化:通过一个类 创建一个对象的过程 Circle c1; //通过圆类 创建具体的圆(对象) c1.m_r = 10; //给圆 对象 的 属性 赋值 cout << "圆的周长为:" << c1.calculateZC() << endl; system("pause"); return 0; }
实例2:创建一个学生类,属性为学号和姓名,可以给姓名学号赋值,可以显示学生的姓名和学号
#include<iostream> #include<string> using namespace std; class Student { public: //访问权限 string m_Name; //属性 int m_Id; void showStudent() //行为 { cout << "姓名:" << m_Name <<" " << "学号:" << m_Id << endl; } }; int main() { //实例化: Student s1; s1.m_Name = "张三"; s1.m_Id = 001; s1.showStudent(); Student s2; s2.m_Name = "李四"; s2.m_Id = 002; s2.showStudent(); system("pause"); return 0; }
通过行为给属性赋值:
#include<iostream> #include<string> using namespace std; class Student //类中的属性和行为称为:成员 { public: //属性 又称:成员属性 成员变量 string m_Name; int m_Id; public: //行为 又称:成员函数 成员方法 void showStudent() { cout << "姓名:" << m_Name <<" " << "学号:" << m_Id << endl; } //给姓名赋值 void setName(string name) { m_Name = name; } //给学号赋值 void setId(int id) { m_Id = id; } }; int main() { //实例化: Student s1; //s1.m_Name = "张三"; //s1.m_Id = 001; s1.setName("张三"); s1.setId(1); s1.showStudent(); Student s2; //s2.m_Name = "李四"; //s2.m_Id = 2; s2.setName("李四"); s2.setId(2); s2.showStudent(); system("pause"); return 0; }
2、将属性和行为加以权限控制
访问权限有三种:1、public-公共权限;2、protected-保护权限;3、private-私有权限;
#include<iostream> #include<string> using namespace std; //访问权限 //1、public-公共权限 成员 类内可以访问 类外也可以访问 //2、protected-保护权限 成员 类内可以访问 类外不可以访问 子类可以访问父类保护权限内的内容 //3、private-私有权限 成员 类内可以访问 类外不可以访问 子类无法访问父类私有权限内的内容 class Person { public: //公共权限 string m_Name; //姓名 protected: //保护权限 string m_Car; //车 private: //私有权限 int m_Password; //银行卡密码 public: void func() { m_Name = "张三"; m_Car = "奔驰"; m_Password = 123456; }; }; int main() { //实例化具体对象 Person p1; p1.m_Name = "李四"; //p1.m_Car = "拖拉机"; //保护权限内容,在类外访问不到 //p1.m_Password = 123; //私有权限内容,在类外访问不到 p1.func(); system("pause"); return 0; }
struct和class区别
在C++中,struct的默认权限为公共,class的默认权限为私有。
#include<iostream> #include<string> using namespace std; //class 和 struct 区别 class C1 { int m_A; //默认是私有权限 private }; struct C2 { int m_A; //默认是公共权限 public }; int main() { C1 c1; //c1.m_A = 100; //在class里默认的权限是私有权限 不可访问 C2 c2; c2.m_A = 100; //在struct里默认的权限是公共权限 可以访问 system("pause"); return 0; }
成员属性设为私有
优点1、将所有成员属性设置为私有,可以自己控制读写权限
#include<iostream> #include<string> using namespace std; //成员属性设为私有 //1、将所有成员属性设置为私有,可以自己控制读写权限 class Person { public: //写姓名 -> 设置姓名 void setName(string name) { m_Name = name; } //读姓名 -> 获取姓名 string getName() { return m_Name; } //读年龄 -> 获取年龄 int getAge() { m_Age = 0; //初始化为0岁 return m_Age; } //写情人 -> 设置情人 void setLover(string lover) { m_Lover = "小泽玛丽亚"; m_Lover = lover; } private: //姓名 可读可写 string m_Name; //年龄 只读 int m_Age; //情人 只写 string m_Lover; }; int main() { Person p; p.setName("张三"); cout << "姓名为:" << p.getName() << endl; //p.m_Age = 18; //不可写 //p.setAge(18); //不可写 cout << "年龄为:" << p.getAge() << endl; p.setLover("仓井"); //cout << "情人为:" << p.m_Lover << endl; //cout << "情人为:" << p.getLover << endl; //不可以访问 system("pause"); return 0; }
优点2、对于写权限,我们可以检测数据的有效性
#include<iostream> #include<string> using namespace std; //成员属性设为私有 //2、对于写权限,我们可以检测数据的有效性 class Person { public: //写姓名 -> 设置姓名 void setName(string name) { m_Name = name; } //读姓名 -> 获取姓名 string getName() { return m_Name; } //读年龄 -> 获取年龄 int getAge() { m_Age = 0; //初始化为0岁 return m_Age; } //写年龄 -> 设置年龄 void setAge(int age) { if (age < 0 || age >150) { cout << "年龄有误" << endl; return; } m_Age = age; } //写情人 -> 设置情人 void setLover(string lover) { m_Lover = "小泽玛丽亚"; m_Lover = lover; } private: //姓名 可读可写 string m_Name; //年龄 可读可写 int m_Age; //情人 只写 string m_Lover; }; int main() { Person p; p.setName("张三"); cout << "姓名为:" << p.getName() << endl; //p.m_Age = 18; p.setAge(1000); cout << "年龄为:" << p.getAge() << endl; p.setLover("仓井"); //cout << "情人为:" << p.m_Lover << endl; //cout << "情人为:" << p.getLover << endl; //不可以访问 system("pause"); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律