4.1 封装(实现手段——class)

有意义的事物都可以抽象。在抽象类的时候不要想着代码是怎么实现,而是用自然语言去分析逻辑即可!否则极易出错。

4.1.1 封装的意义

封装是C++面向对象三大特性之一,通过对客观事物的抽象,分析事物的本质特征,总结和提炼事物的行为和属性,并用类和对象表示的过程。

封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制

封装意义一:

在设计类的时候,属性和行为写在一起,表现事物

语法: class 类名{ 访问权限: 属性 / 行为 };

示例1:设计一个圆类,求圆的周长

示例代码:

#include<iostream>
using namespace std;
//圆周率
#define PI 3.14//1、封装的意义
//将属性和行为作为一个整体,用来表现生活中的事物//封装一个圆类,求圆的周长
//class代表设计一个类,后面跟着的是类名
class Circle
{public:  //访问权限  公共的权限//属性int r;//半径//行为//获取到圆的周长double calculateZC(){//2 * pi  * r//获取圆的周长return  2 * PI * r;}
};int main() {//通过圆类,创建圆的对象// c1就是一个具体的圆Circle c1;c1.r = 10; //给圆对象的半径 进行赋值操作//2 * pi * 10 = = 62.8cout << "圆的周长为: " << c1.calculateZC() << endl;return 0;
}

示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号

示例2代码:

//学生类
class Student {public://通过成员函数给成员属性赋值void setName(string name) {m_name = name;}void setID(int id) {m_id = id;}
//通过成员函数来输出成员属性void showStudent() {cout << "name:" << m_name << " ID:" << m_id << endl;}
public:string m_name;int m_id;
};int main() {Student stu;stu.setName("德玛西亚");stu.setID(250);stu.showStudent();return 0;
}

注:对于类内的属性和行为,统一称为成员;
属性 :又称成员属性、成员变量;
行为 :又称成员函数、成员方法。

封装意义二:

类在设计时,可以把属性和行为放在不同的权限下,加以控制

访问控制:

  1. public 公共权限 (成员在类内、类外都可以访问)
  2. private 私有权限 (本类(不是本对象)或友元可以访问)
  3. protected 保护权限(对本类相当于private,对派生类以后再讲解)

4.不可访问:以后再讲解

示例:

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 p;p.m_Name = "李四";//p.m_Car = "奔驰";  //保护权限类外访问不到//p.m_Password = 123; //私有权限类外访问不到return 0;
}

4.1.2 struct和class区别

在C++中 struct和class唯一的区别就在于 默认的访问权限不同

区别:

  • struct 默认权限为公共
  • class 默认权限为私有

示例

class C1
{int  m_A; //默认是私有权限
};struct C2
{int m_A;  //默认是公共权限
};int main() {C1 c1;c1.m_A = 10; //错误,访问权限是私有C2 c2;c2.m_A = 10; //正确,访问权限是公共return 0;
}

4.1.3 成员属性设置为私有

建议:class中的属性都设置为private,在private外再设置public接口来设置成员行为

优点1:将所有成员属性设置为私有,可以自己控制读写权限
(可读可写/只读/只写)
优点2:对于写权限,我们可以检测数据的有效性

示例:

class Person {public://姓名设置可读可写void setName(string name) {m_Name = name;}string getName(){return m_Name;}//获取年龄 int getAge() {return m_Age;}//设置年龄void setAge(int age) {if (age < 0 || age > 150) {return;}m_Age = age;}//情人设置为只写void setLover(string 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.setAge(50);cout << "年龄: " << p.getAge() << endl;//情人设置p.setLover("Lucy");//cout << "情人: " << p.m_Lover << endl;  //只写属性,不可以读取return 0;
}

注:
1、读即为get,意为输出;写即为set,意为传入/修改数据
2、类可以嵌套:
示例 :

class point{public:
//设置x:
void set_x(int x){m_x = x;
}
//获取x
int get_x(){return m_x;
}private:int m_x;int m_y;
};
class circle{private:int m_R;//半径point m_center;//圆心
};

在类中,可以让另一个类,作为这个类中的成员

若要比较某个类实例化出来的对象是否完全相等,
① 若用全局函数,通常考虑返回值为bool类型,形参传递时需要传两个对象,类似于bool issame(cube c1, cube c2);

② 若用成员函数,则形参传递只需传一个参数(即另一个对象), 自己本身类内的对象无需传递,而且若成员属性是私有的,无法直接访问,用一个获取成员属性的get函数获取即可,类似于bool issame(c2) { if (m_L == c2.getL() ) return true};,其中m_L是这个类自己的某个成员属性。

信息隐蔽:(实现手段——访问控制)

在用类和对象表示事物时,只将行为和属性公开给可信的外部事物。相应地,隐藏自身的内部特征信息。

  • 隐藏行为、操作:事物的一个行为特征可由多个操作过程构成,在C++中一个操作通常由一个或多个成员函数实现。
    设计时,可隐藏全部或部分成员函数。
  • 隐藏数据:数据本身用private,类外访问可通过类内的get、set等函数来实现。

信息隐蔽的意义:

  • 减少外部可见行为和数据

  • 对象间只通过可见行为交互

  • 使软件更安全、可靠

  • 维护方便

  • 便于复用(只需修改公有部分)

补充:分离使用和实现

  • 类的使用者:调用方
  • 类的实现:成员函数实现、数据的表示、组织等。

    (如果成员函数不用外联实现则需#include <B.h>,耦合度增加)

封装和信息隐蔽的作用:

  • 面向对象的基石

在程序设计中的作用:

  • 分离使用和实现(函数实现、数据组织、数据表示等)
  • 分离接口与实现
  • 软件复用

C++面向对象三大特性——封装与信息隐蔽相关推荐

  1. Python OOP:面向对象三大特性(封装、继承、多态)、类属性和实例属性、类方法@classmethod、静态方法@staticmethod、函数和类callable、__call__

    一.面向对象三大特性 二.多态 定义:多态是⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以产⽣不同的执⾏结果. 一个父类,可以继承给多个子类,每个不同的子类可以创建多个对象 ...

  2. Java面向对象三大特性(封装、继承、多态)

    文章目录 前言 一.封装 1. 封装的概念 2. private实现封装 3. getter和setter方法 4.封装的好处 二.继承 1. 继承的概念 2. extends实现继承 3. supe ...

  3. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  4. Java面向对象三大特性(封装继承多态)解释及案例

    文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...

  5. 面向对象三大特性: 封装

    封装 封装:每个对象都包含有它能进行操作的所有信息,这个特性称为封装.这样的方法包含在类中,通过类的实例来实现. e.g. 我们可以使用遥控器. 遥控器有多个功能 封装的优点 A.良好的封装能够减少耦 ...

  6. 面向对象三大特性-封装

    封装: [封装]          隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处]  1. 将变化隔离:  2. 便于使用: 3. 提高复用性:  4. 提高安全性: [封装原则]    ...

  7. python面向对象三大特性_Python面向对象之多态原理与用法案例分析

    本文实例讲述了Python面向对象之多态原理与用法.分享给大家供大家参考,具体如下: 目标 多态 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 定义类的准则 继承 ...

  8. Study16 面向对象三大特性

    面向对象三大特性 封装: 该露的露,该藏的藏 程序设计要求**"高内聚,低耦合"**.高内聚就是类的内部数据操作细节自己完成,不允许外部干涉:低耦合:仅暴露少量的方法给外部使用 封 ...

  9. JS面向对象三大特性

    首先对象的声明语法 1.通过Object var object = new Object(); //动态添加属性.方法 object.name='test'; object.method = func ...

最新文章

  1. mysql在线模拟器_力荐一款在线SQL模拟器
  2. 用jenkins搭建android自动打包环境
  3. (正)斜杠 与 反斜杠
  4. jx problem
  5. Android之网络编程
  6. 移动apn接入点哪个快_手机移动网络获取IPv6
  7. mysql日志输出到syslog_在chroot环境下将MySQL日志输出到syslog
  8. 105 基于socketserver实现并发的socket编程
  9. 18awg线材最大电流_USB4来了,最大的变化是这个
  10. 使用CORS解决跨域问题
  11. 针对浏览器主页被360或hao123锁定的解决方法
  12. 编译原理 3.28 作业
  13. js中判断是否为图片以及常见图片后缀
  14. raid5换硬盘显示ready_[原创]戴尔服务器raid5更换硬盘状态foreign怎么改成ready
  15. 校本课程——宝宝爱上学
  16. 结合本科C++项目的MFC学习总结
  17. 产品原则和产品评审团
  18. 书本ISBN号码校验
  19. mount指令之-o参数解析
  20. 五金冲压模具设计详细解说!

热门文章

  1. 【Linux】进程控制(exec函数族)的理解和使用
  2. vue 插槽scope_Vue插槽原理与用法详解
  3. centos关闭防火墙命令
  4. composer 下载phpmailer
  5. 【视频】视频播放(包含视频录制)的测试点总结
  6. 信创办公--基于WPS的Word最佳实践系列(添加文件部件)
  7. 前端(vue)实现图形(拼图等)验证码
  8. idea连接数据库时区设置
  9. Mac OS X的火狐上安装Burp's CA Certificate
  10. 不显示删除回复显示所有回复显示星级回复显示得分回复 一个面向对象开发程序员写的情书