目录
封装案例1:设计一个学生类,可以给姓名和学号赋值,可以显示学生的姓名和学号。
面向对象编程(OOP)是现代编程的基石之一。C++是一种支持OOP的语言,允许你创建类(Class)和对象(Object)。
类是对对象的抽象。类是一种抽象的数据类型。它们的关系是,对象是类的实例,类是对象的模板。对象是通过new className产生的,用来调用类的方法;类的构造方法 。
类的意义:
2-1.类是把属性和方法进行封装,同时对类的属性和方法进行访问控制。
2-2.类是由我们根据客观事物抽象而成,形成一类事物,然后用类去定义对象,形成这类事物的具体个体。
2-3.类是一个数据类型,类是抽象的,而对象是一个具体的变量,是占用内存空间的。
类的访问控制
在C++中可以对类的属性和方法定义访问级别,public修饰的属性和方法,可以在类的内部访问,也可以在类的外部进行访问。private修饰的属性和方法,只能在类的内部进行访问。
行为
所有对象公有操作即成员函数(通常习惯为public属性)属性:所有对象公有特性即数据成员(通常习惯为protected属性)C++面向对象的三大特性为:封装,继承,多态。
封装目的是实现代码模块化,继承目的是实现代码扩展,静态多态的目的是函数重载和泛型编程,动态多态的目的是虚函数重写。
C++认为万事皆为对象,对象上有其属性和行为
例如:
人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭、唱歌…
车也可以作为对象,属性有轮胎、方向盘、车灯...行为有载人、放音乐、放空调...
具有相同性质的对象,我们 可以抽象称为类,人属于人类,车属于车类
封装是C++面向对象的三大特性之一,封装就是将数据和行为有机结合起来,形成一个整体。把数据和处理数据的操作结合形成类,数据和函数都是类的成员。
1.封装的意义:
2.语法:
class 类名{访问权限:属性/行为}
示例:通过一个圆类中的行为得到圆的周长
- #include
-
- #include
-
- using namespace std;
-
- // 圆周率
-
- const double PI = 3.14;
-
- // 设计一个圆类 求圆的周长
-
- // class(一个类) 类名
-
- // class代表设计一个类,类后面紧跟着的就是类的名称
-
- class circle {
-
- // 访问权限
-
- // 公共权限
-
- public:
-
- // 属性
-
- // 半径
-
- int r;
-
- //行为:一般为函数
-
- // 获取周长
-
- double calculateZC()
-
- {
-
- return 2 * PI * r;
-
- }
-
- };
-
-
-
- int main()
-
- {
-
- // 通过圆类创建具体的圆(对象)
-
- // 实例化 ( 通过一个类 创建一个对象的过程 )
-
- circle c1;
-
- // 给圆对象 的属性进行赋值
-
- c1.r = 10;
-
- cout << "圆的周长:" << c1.calculateZC() << endl;
-
- return 0;
-
- }
运行结果:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- #include
-
- #include
-
- using namespace std;
-
- // 设计一个学生类,属性有姓名和学号
-
- // 可以给姓名和学号赋值,可以显示学生的姓名和学号
-
- // 设计学生类
-
- class student {
-
- public: // 公共权限
-
-
-
- // 类中的属性和行为 我们统一称为 成员
-
- // 属性 成员属性 成员变量
-
- // 行为 成员函数 成员方法
-
-
-
- // 属性
-
- string name;
-
- int id;
-
-
-
- // 行为
-
- // 显示姓名与学号
-
- void showstu()
-
- {
-
- cout << "姓名: " << name << " 学号: " << id << endl;
-
- }
-
-
-
- // 可以通过对象的行为给属性赋值
-
- void setname(string i_name)
-
- {
-
- name = i_name;
-
- }
-
- void setID(int i_id)
-
- {
-
- id=i_id;
-
- }
-
- };
-
- int main()
-
- {
-
- // 创建一个具体的学生
-
- // 实例化对象
-
- class student s1;
-
- // 给s1属性赋值
-
- s1.setname("张三");
-
- s1.id = 01;
-
- s1.showstu();
-
-
-
- class student s2;
-
- // 给s2属性赋值
-
- s2.name = "李四";
-
- s2.id = 02;
-
- s2.showstu();
-
-
-
- class student s3;
-
- // 通过对象的行为给属性赋值
-
- s3.setname("王五");
-
- s3.setID(03);
-
- s3.showstu();
-
- return 0;
-
- }
运行结果:
类在设计时,可以把属性和行为放在不同的权限下,加以控制。
1. public 公共权限 成员 类内类外都可以访问
2. protected 保护权限 成员 类内可以访问,类外不可以访问(有继承关系,父子关系)
3. private 私有权限 成员 类内可以访问,类外不可以访问(父子关系也不可以访问)
示例:
- #include
-
- using namespace std;
-
- class person{
-
- public:
-
- // 公共权限
-
- string name;
-
-
-
- protected:
-
- // 保护权限
-
- string car;
-
-
-
- private:
-
- // 私有权限
-
- int password;
-
-
-
- public:
-
- void fun()
-
- {
-
- name = "张三";
-
- car = "BMW";
-
- password = 123456;
-
- }
-
- // 不管哪种形式在类内都是可以访问的
-
- };
-
- int main ()
-
- {
-
- // 实例化具体的对象
-
- class person p1;
-
- p1.name = "李四";
-
-
-
- p1.car = "AMG"; // 保护权限的内容在类外是不能访问的
-
-
-
- p1.password = 258258; // 私有权限的内容在类外是不能访问的
-
- return 0;
-
- }
报错显示:
在c++中struct和class唯一的区别就在于默认的访问权限不同
区别:
struct 默认是公共权限
class 默认是私有权限
示例:
- #include
-
- using namespace std;
-
- class C1
- {
-
- int m_A;// 默认权限 是私有
-
- };
-
- struct C2
- {
-
- int m_A;// 默认权限 是公共
-
- };
-
- int main ()
-
- {
-
- class C1 c1;
-
- c1.m_A=1000;
-
- struct C2 c2;
-
- c2.m_A=100;
-
- return 0;
-
- }
报错显示:
1. 将所有成员属性设置为私有,可以自己控制读写权限
2. 对于写权限,可以检测数据的有效性
示例:
- #include
-
- #include
-
- using namespace std;
-
- // 设计一个人类
-
- class person{
-
- // 设计一个public 的公共接口
-
- public:
-
- // 设置姓名
-
- void set_name(string in_name)
-
- {
-
- name = in_name;
-
- }
-
- // 获取姓名
-
- string get_name()
-
- {
-
- return name;
-
- }
-
- // 设置年龄
-
- void set_age(int in_age)
-
- {
-
- if(in_age<=0||in_age>150){
-
- cout<<"你输入的年龄有误!"<
-
- return;
-
- }
-
- age=in_age;
-
- }
-
- // 获取年龄
-
- int get_age()
-
- {
-
- return age;
-
- }
-
- // 设置情人,只写
-
- void set_lover(string in_lover)
-
- {
-
- lover = in_lover;
-
- }
-
- private:
-
- // 姓名 可读可写
-
- string name;
-
-
-
- // 年龄 可读可写
-
- int age = 0;
-
-
-
- // 情人 只写
-
- string lover;
-
- };
-
- int main()
-
- {
-
- class person p1;
-
- p1.set_name("张三");
-
- cout<<"姓名为: "<
get_name()< -
- p1.set_age(200);
-
- cout<<"年龄为: "<
get_age()< -
- p1.set_lover("鞠婧祎");
-
- return 0;
-
- }
运行结果:
四、封装案例
案例1:设计立方体类
设计立方体类(Cube)
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等。
示例:
- #include
-
- #include
-
- using namespace std;
-
- /*
- 1.创建立方体类
- 2.设计属性
- 3.设计行为 获取立方体面积和体积
- 4.分别利用全局函数和成员函数 判断两个立方体是否相等
- */
-
- // 立方体类
-
- class Cube{
-
- public:
-
- void setL(int L)
-
- {
-
- m_L=L;
-
- }
-
- int getL()
-
- {
-
- return m_L;
-
- }
-
- void setW(int W)
-
- {
-
- m_W=W;
-
- }
-
- int getW()
-
- {
-
- return m_W;
-
- }
-
-
-
- void setH(int H)
-
- {
-
- m_H=H;
-
- }
-
- int getH()
-
- {
-
- return m_H;
-
- }
-
-
-
- // 获取立方体的面积
-
- int calculateS()
-
- {
-
- return 2*(m_L*m_W+m_W*m_H+m_L*m_H);
-
- }
-
- // 获取立方体的体积
-
- int calculateV()
-
- {
-
- return m_L*m_H*m_W;
-
- }
-
-
-
- // 利用成员函数判断两个立方体是否相等
-
- bool isSameByClass(Cube &C)
-
- {
-
- if(m_L==C.getL()&&m_W==C.getW()&&m_H==C.getH()){
-
- return true;
-
- }
-
- return false;
-
- }
-
- private:
-
- int m_L;// 长
-
- int m_W;// 宽
-
- int m_H;// 高
-
- };
-
- // 利用全局函数判断 两个立方体是否相等
-
- bool isSame(Cube &C1,Cube &C2)
-
- {
-
- if(C1.getL()==C2.getL()&&C1.getW()==C2.getW()&&C1.getH()==C2.getH()){
-
- return true;
-
- }
-
- return false;
-
- }
-
- int main()
-
- {
-
- // 创建一个立方体对象
-
- class Cube C1;
-
- C1.setL(10);
-
- C1.setW(10);
-
- C1.setH(10);
-
- cout<<"C1的面积为:"<
calculateS()< -
- cout<<"C1的体积为:"<
calculateV()< -
-
-
- // 创建第二个立方体
-
- class Cube C2;
-
- C2.setL(10);
-
- C2.setW(20);
-
- C2.setH(10);
-
-
-
- // 全局函数判断
-
- bool ret=isSame(C1,C2);
-
- if(ret){
-
- cout<<"C1和C2是相等的"<
-
- }
-
- else{
-
- cout<<"C1和C2是不相等的"<
-
- }
-
-
-
- // 成员函数判断
-
- ret=C1.isSameByClass(C2);
-
- if(ret){
-
- cout<<"成员函数判断:C1和C2是相等的"<
-
- }
-
- else{
-
- cout<<"成员函数判断:C1和C2是不相等的"<
-
- }
-
- return 0;
-
- }
运行结果:
案例2:点和圆的关系
设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。
示例:
- #include
-
- #include
-
- #include
-
- using namespace std;
-
- // 判断点和圆的关系
-
- /*
- 点到圆心的距离== 半径 点在圆上
- 点到圆心的距离 > 半径 点在圆外
- 点到圆心的距离 < 半径 点在圆内
- */
-
- class Point
-
- {
-
- public:
-
- void setX(int X)
-
- {
-
- m_X=X;
-
- }
-
- int getX()
-
- {
-
- return m_X;
-
- }
-
- void setY(int Y)
-
- {
-
- m_Y=Y;
-
- }
-
- int getY()
-
- {
-
- return m_Y;
-
- }
-
- private:
-
- int m_X;
-
- int m_Y;
-
- };
-
- class Circle
-
- {
-
- public:
-
- // 设置半径
-
- void setR(int R)
-
- {
-
- m_R=R;
-
- }
-
- int getR()
-
- {
-
- return m_R;
-
- }
-
- // 设置圆心
-
- void setCenter(Point center)
-
- {
-
- m_Center=center;
-
- }
-
- Point getCenter()
-
- {
-
- return m_Center;
-
- }
-
- private:
-
- int m_R; // 半径
-
- class Point m_Center;
-
- };
-
- // 判断点和圆的关系
-
- void isInCircle(Circle &c,Point &p)
-
- {
-
- // 计算两点间距离
-
- int distance=pow((pow(c.getCenter().getX()-p.getX(),2))+(pow(c.getCenter().getY()- p.getY(),2)),0.5);
-
-
-
- if(distance==c.getR()){
-
- cout<<"点在圆上"<
-
- }else if(distance > c.getR()){
-
- cout<<"点在圆外"<
-
- }else{
-
- cout<<"点在圆内"<
-
- }
-
- }
-
- int main()
-
- {
-
- // 创建一个圆 和一个圆心 的对象
-
- Circle c;
-
- c.setR(10);
-
- Point center;
-
- center.setX(10);
-
- center.setY(0);
-
- c.setCenter(center);
-
-
-
- // 创建一个点
-
- Point P;
-
- P.setX(10);
-
- P.setY(9);
-
-
-
- // 全局函数判断点和圆的位置关系
-
- isInCircle(c,P);
-
- return 0;
-
- }
运行结果:
-
相关阅读:
Redis常用数据结构操作与底层原理
解读OpenShift的逻辑架构和技术架构
Java中的自定义异常
3D-2D PNP
MySQL 从一个表中查出数据并插入到另一个表处理方案(详细)
2022-vue实现-“对象数组“-模糊搜索功能
layui laydate 提示“日期格式不正确”
Web3D虚拟人制作简明指南
动态数据渲染订单查询实现
Java 类之 java.lang.reflect.Method
-
原文地址:https://blog.csdn.net/hjl011006/article/details/132915055