C++面向对象三大特性——封装与信息隐蔽
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;
}
注:对于类内的属性和行为,统一称为成员;
属性 :又称成员属性、成员变量;
行为 :又称成员函数、成员方法。
封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问控制:
- public 公共权限 (成员在类内、类外都可以访问)
- private 私有权限 (本类(不是本对象)或友元可以访问)
- 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++面向对象三大特性——封装与信息隐蔽相关推荐
- Python OOP:面向对象三大特性(封装、继承、多态)、类属性和实例属性、类方法@classmethod、静态方法@staticmethod、函数和类callable、__call__
一.面向对象三大特性 二.多态 定义:多态是⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以产⽣不同的执⾏结果. 一个父类,可以继承给多个子类,每个不同的子类可以创建多个对象 ...
- Java面向对象三大特性(封装、继承、多态)
文章目录 前言 一.封装 1. 封装的概念 2. private实现封装 3. getter和setter方法 4.封装的好处 二.继承 1. 继承的概念 2. extends实现继承 3. supe ...
- 深入理解Java面向对象三大特性 封装 继承 多态
1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...
- Java面向对象三大特性(封装继承多态)解释及案例
文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...
- 面向对象三大特性: 封装
封装 封装:每个对象都包含有它能进行操作的所有信息,这个特性称为封装.这样的方法包含在类中,通过类的实例来实现. e.g. 我们可以使用遥控器. 遥控器有多个功能 封装的优点 A.良好的封装能够减少耦 ...
- 面向对象三大特性-封装
封装: [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 1. 将变化隔离: 2. 便于使用: 3. 提高复用性: 4. 提高安全性: [封装原则] ...
- python面向对象三大特性_Python面向对象之多态原理与用法案例分析
本文实例讲述了Python面向对象之多态原理与用法.分享给大家供大家参考,具体如下: 目标 多态 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 定义类的准则 继承 ...
- Study16 面向对象三大特性
面向对象三大特性 封装: 该露的露,该藏的藏 程序设计要求**"高内聚,低耦合"**.高内聚就是类的内部数据操作细节自己完成,不允许外部干涉:低耦合:仅暴露少量的方法给外部使用 封 ...
- JS面向对象三大特性
首先对象的声明语法 1.通过Object var object = new Object(); //动态添加属性.方法 object.name='test'; object.method = func ...
最新文章
- mysql在线模拟器_力荐一款在线SQL模拟器
- 用jenkins搭建android自动打包环境
- (正)斜杠 与 反斜杠
- jx problem
- Android之网络编程
- 移动apn接入点哪个快_手机移动网络获取IPv6
- mysql日志输出到syslog_在chroot环境下将MySQL日志输出到syslog
- 105 基于socketserver实现并发的socket编程
- 18awg线材最大电流_USB4来了,最大的变化是这个
- 使用CORS解决跨域问题
- 针对浏览器主页被360或hao123锁定的解决方法
- 编译原理 3.28 作业
- js中判断是否为图片以及常见图片后缀
- raid5换硬盘显示ready_[原创]戴尔服务器raid5更换硬盘状态foreign怎么改成ready
- 校本课程——宝宝爱上学
- 结合本科C++项目的MFC学习总结
- 产品原则和产品评审团
- 书本ISBN号码校验
- mount指令之-o参数解析
- 五金冲压模具设计详细解说!