第一层:封装

简介: 第一层:封装

前言


在一方神秘的土地上,有一座高耸入云的塔,叫做C++,经历了之前C语言对我的磨砺,我步入的这座神秘的古塔。


类和对象


进入这座古塔中,一段话浮现在我的脑海之中,C++面向对象有三大特性:封装、继承、多态,

同样,C++认为万事万物都可以为对象,对象具有属性和行为,比如,人可以作为对象,属性有姓名、年龄、身份证号、身高、体重,行为有跑步、吃饭、睡觉,那这些具有相同属性的对象,称为类,人属于人类,任何事物都有所属的类别。


封装


了解完这些我大为震撼,不愧是C++,这是有一道声音飘来,“挑战者,你今天的任务就是掌握封装的力量,封装可以隐藏事物实现的细节,对外提供访问方式,你若掌握成功此力量,便能突破这第一层。”声音散去,出现在眼前的只有一串的代码和注释…


class


代码的开始是一个class,它代表了这是一个类,只有先写上class,后面跟着类名,任何在大括号中写入我们这个类的权限、属性、行为便创建好了一个类,这个时候可以试着去创建一个学生类,属性有名字、学号,行为可以访问名字和学号。


#include<iostream>
using namespace std;
#include<string>
class student
{
  //属性
  string name;//名字
  string stunum;//学号
  //行为
  void print()
  {
  cout << "name: " << name<< endl;
  cout << "stunum: " << stunum << endl;
  }
};


权限


在class当中提到了一个概念,叫做权限,权限是封装比较重要的东西,它可以让不同的属性、行为的权限是不一样,权限分为三种:public、protected、private。


public


public是公共权限,它权限下的东西可以可以在类外进行访问,也可以在类内进行访问,类外类内,指的就是我们的class大括号,大括号内是类内,大括号外是类外,可以进行验证一下。


#include<iostream>
using namespace std;
#include<string>
class student
{
public:
  string name;
  string stunum;
  void print()
  {
  cout << "name: " << name<< endl;
  cout << "stunum: " << stunum << endl;
  }
};
int main()
{
  student s1;
  cin >> s1.name;
  cin >> s1.stunum;
  s1.print();
  return 0;
}


0a2653c851af460fa595bd959398a8f1.png0a2653c851af460fa595bd959398a8f1.png

0a2653c851af460fa595bd959398a8f1.png

可以看到,程序成功的跑起来了,我们在类外也对类内的属性进行的修改,也能访问我们类内的行为。


protected


protected是保护权限,在该权限下的内容不可以在类外进行访问,但是可以在类内进行访问,同时,它可以让我们的“儿子”(继承中的概念)进行访问,同样可以试一下。


#include<iostream>
using namespace std;
#include<string>
//男人
class man
{
//保护权限
protected:
  string _name;//名字
  string _car;//车
  string _age;//年龄
};
int main()
{
  man m1;
  cout << m1._name << endl;
  return 0;
}


0eacb84100b54626af849e6b562bf92a.png

0eacb84100b54626af849e6b562bf92a.png

2d65d23f6d4748949b924e4057485923.png

可以看到是有报错的,报错原因也有,不可访问。


private


private是我们的私密权限,他和我们的protected对于类内类外的访问权限是不一样的,他们的区别在于,protected,它权限下的东西是可以让“儿子”访问的,但是private是不可以让我们的“儿子”访问的,如果类外访问,可以参考protected的报错。


struct和class的区别


根据学习结构体可以得知,struct的作用和class是基本一致的,访问类内成员的方式也是一样的,那它们两个根本的区别是什么?既然作用是基本一致的,为什么要分成两个?这里就是上面所讲的结构问题,对于我们的struct来说,如果类内不分权限的,它的默认权限是公共权限public,而class的默认权限是私有权限private,这里可以用代码的方式得出结论。


#include<iostream>
using namespace std;
#include<string>
//用结构体命名的学生1
struct stu1
{
  string _name;
};
//用类命名的学生2
class stu2
{
  string _name;
};
int mian()
{
  struct stu1 s1;
  stu2 s2;
  cin >> s1._name;
  cin >> s2._name;
  return 0;
}


0a2653c851af460fa595bd959398a8f1.png

0a2653c851af460fa595bd959398a8f1.png0eacb84100b54626af849e6b562bf92a.png

同样的是用默认权限,可以看到,struct的可以类外访问,而class的不能进行类外访问。


封装的好处


1封装可以隐藏我们实现的细节

2.可以提高我们代码的安全性


对于封装而言,可以让程序员自己分配我们类内属性和行为的权限,更加安全,同时可以隐藏掉一些我们实现动作时候的细节。


封装的用法


封装的作用不仅仅是我们表面上看到的那么简单,我们可以让类的属性私有化,如何对外留有访问方式,我们可以决定类外对于这个属性的行为,可以是可读可写,也可以是只读不写,只要是我们想,那就可以去实现,比如现在可以实现个案例,如下图:

2d65d23f6d4748949b924e4057485923.png

去实现一个男人类,他有三个属性,姓名,汽车,妻子,其中姓名和汽车是可以让人知道的,但是不能让每个人都访问,属于保护权限,妻子属于自己一个人的,谁都不能去占用,属于私有权限,同时需要留出接口用于访问类内的元素。


#include<iostream>
using namespace std;
#include<string>
//男人类
class man
{
//公共权限,对外留的访问接口
public:
  //对名字进行写入
  void get_name(string s1)
  {
  _name = s1;
  }
  //对名字进行读出
  string read_name()
  {
  return _name;
  }
  //对于汽车进行写入
  void get_car(string car)
  {
  _car = car;
  }
  //对妻子进行写入
  void get_wife(string wife)
  {
  _wife = wife;
  }
//保护权限,“儿子”可以访问
protected:
  string _name;//名字
  string _car;//汽车
//私有权限,“儿子”不可以访问,只有自己可以访问
private:
  string _wife;//妻子
};
int main()
{
  man m1;
  m1.get_name("狗蛋");
  m1.get_car("劳斯莱斯幻影");
  m1.get_wife("翠花");
  cout << "这个男人的名字叫:" << m1.read_name() << endl;
  return 0;
}


通过运行结果只能看出,“狗蛋”的名字是写入进去了,那其他的呢?可以通过调试的窗口看出。

2e9b90b2ca334476abebe75bafe6eeaa.png

通过调试可以看出,我们的写入很成功,这也是封装最基本的用法。

4cebaac233b3433da32a72337a77fc60.png


学完封装,突破第一层


看完面前石板的内容,经过了我孜孜不倦的学习,终于掌握了封装的力量,“少年人,你很不错,上第二层去吧。”…


相关文章
|
19天前
抽象和封装
抽象和封装
17 0
|
8月前
|
Java
一张图理解javaEE层与层之间的关系
一张图理解javaEE层与层之间的关系
|
19天前
|
Java 调度
抽象,封装
抽象,封装
15 1
|
19天前
|
Java
java实现遍历树形菜单方法——Dao层
java实现遍历树形菜单方法——Dao层
12 0
|
19天前
|
JSON 前端开发 Java
|
10月前
|
安全
封装思想
封装思想
37 0
|
10月前
|
JavaScript
封装递归tree组件
封装递归tree组件
21 0
|
11月前
|
数据库
三层和实体层的区别
三层和实体层的区别
33 0
|
Java
10 抽象与封装
10 抽象与封装
57 0
|
存储 编译器 C语言
C++修炼之筑基期第一层——认识类与对象
C++修炼之筑基期第一层——认识类与对象
39 0