C++面向对象三大特性——封装与信息隐蔽
4.1 封装(实现手段——class)
有意义的事物都可以抽象。在抽象类的时候不要想着代码是怎么实现,而是用自然语言去分析逻辑即可!否则极易出错。
4.1.1 封装的意义
封装是C++面向对象三大特性之一,通过对客观事物的抽象,分析事物的本质特征,总结和提炼事物的行为和属性,并用类和对象表示的过程。
封装的意义:
- 将属性和行为作为一个整体,表现生活中的事物
- 将属性和行为加以权限控制
封装意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法: class 类名{ 访问权限: 属性 / 行为 };
示例1:设计一个圆类,求圆的周长
示例代码:
#include
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,耦合度增加)
封装和信息隐蔽的作用:
- 面向对象的基石
在程序设计中的作用:
- 分离使用和实现(函数实现、数据组织、数据表示等)
- 分离接口与实现
- 软件复用
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
