浅谈类的封装

类的封装

实验介绍

封装是类的本身属性,类就是将需要的数据以及函数放在(封装)类内部,使用该类实例化的对象可以使用类内部的数据和函数,通常来说学习一样东西只要问三个问题就可以了。

  1. why?
  2. what?
  3. how?
知识点
  • 封装的概念
  • 封装的优点
  • 类成员的访问权限

为何封装 (why?)

封装是 C++ 语言的特点,通过设定访问权限来限制访问和访问方式,也是继承和多态的前提。

  • 保证数据不被外界干扰和误用,解决安全性。
  • 让类库设计者可以方便更改类的内部,解决维护效率。
  • 隐藏细节,代码模块化,使用者不必关心内部实现原理,解决代码重用性。
  • 减少耦合(即与其他模块之间资讯或参数流动的程度)。

封装的概念 (what?)

官方定义:封装是将数据和处理数据的程序组合起来,仅对外公开接口,达到信息隐藏的功能。

C++ 程序两个基本要素:

  • 程序语句(代码):程序中执行动作的部分,也被称为函数。
  • 数据:程序的信息。

C++ 中使用 class 关键字来对程序进行封装。

所谓的封装就是有选择性的暴露接口给用户,将数据和操作函数绑定在一起的概念,这样能避免受到外界的干扰和误用,从而保证安全。

将程序封装起来后,用户只能通过接口输入信息,得到想要的输出即可,中间的处理过程是不让用户知道(输入数据 --> 程序处理 --> 输出)。

例子 1 :芯片就是用里面的电路封装起来,留出管脚进行操作,这是封装的典型例子。

概念介绍
名词 解释
数据隐藏 将程序数据隐藏起来,不让用户直接进行访问
数据封装 将数据和操作数据的函数绑定在一起的机制
数据抽象 面向用户保留接口而把具体的实现细节隐藏起来的机制

类的访问权限 (how?)

C++ 使用关键字 class 来进行封装,使用 publicprotectedprivate 关键字表示封装的状态。

关键字
  • class:对类进行封装。
  • public:共有成员,用户能够直接访问类中 public 属性的数据成员和成员函数。
  • protected:保护成员,用户不能直接访问数据成员和成员函数,继承该类后可以访问。
  • private:私有成员,用户不能直接访问数据成员和成员函数。
示例代码 1

使用上一章中的示例代码,这里重点来讲解类的权限问题。

#include <iostream>
#include <string>
using namespace std;

// 将学生的属性进行封装
class Student
{
   
public: // 公有属性
    Student() {
   }
    ~Student() {
   }

    void setName(string name) {
    this->name = name; }
    string getName() const {
    return name; };
    void setAge(int age) {
    this->age = age; }
    int getAge() const {
    return age; }
private: // 私有属性
    string name;
    int age;
};

int main()
{
   
    // 堆上实例化
    Student *stu = new Student;

    // 正确访问
    stu->setName("Siri");
    stu->setAge(5);

    // 错误访问,编译报错
    // stu->name = "jake";
    // stu->age = 18;

    // 正确访问
    cout << "My name is " << stu->getName() << ", I'm " << stu->getAge() << " years old." << endl;

    // 释放内存
    delete stu;
    stu = nullptr;

    return 0;
}
示例代码 2
#include <iostream>
#include <string>
using namespace std;

class Point
{
   
    // 私有属性
    double x;
    double y;
public: // 公有属性
    Point() {
   }
    ~Point() {
   }

    void setX(double x) {
    this->x = x; }
    double getX() const {
    return x; };
    void setY(double y) {
    this->y = y; }
    double getY() const {
    return y; };
};

int main()
{
   
    // 堆上实例化
    Point *point = new Point;

    // 正确访问
    point->setX(1);
    point->setY(5);

    // 错误访问,私有成员不能直接访问,编译报错
    point->x = 3;
    point->y = 9;

    // 释放内存
    delete point;
    point = nullptr;

    return 0;
}
示例代码 3
#include <iostream>
#include <string>
using namespace std;

struct Cat
{
   
    // 公有属性
    string name;
    Cat() {
   }
    ~Cat() {
   }

    void setName(string name) {
    this->name = name; }
    string getName() const {
    return name; };
};

int main()
{
   
    // 堆上实例化
    Cat *cat = new Cat;

    // 正确访问
    cat->setName("kitty");

    // 正确访问,name 属于公有数据成员
    cat->name = "siri";

    cout << "My name is " << cat->name << " ." << endl;

    // 释放内存
    delete cat;
    cat = nullptr;

    return 0;
}
代码解释
  • 示例代码 1 中,学生类 private 以下区域的数据成员 nameage 都属于私有数据成员,public 下的成员函数都是属于公有属性。
  • 默认情况下,类的成员都是私有属性,例如示例代码 2 中 Point 类的数据成员 xy 都是属于私有属性。
  • structclass 是类似的功能,但是 struct 默认情况下成员都是公有属性,如示例代码 3,struct 一般用于定义数据结构。
  • 数据成员与成员函数绑定,不能直接对私有数据成员进行访问,如果需要访问数据成员则需要访问对应绑定的公有成员函数。

实验总结

在学习 C++ 之初就开始接触 classpublicprotectedprivate 等,本次实验却又单独拿出来讲,这是因为强调 “封装”,就像我们经常听一首歌却叫不出歌名一样,现在正式告诉你 “歌名”。

相关推荐

  1. 封装

    2023-12-07 22:32:02       42 阅读
  2. IDEA目录

    2023-12-07 22:32:02       29 阅读
  3. MATLAB安装

    2023-12-07 22:32:02       22 阅读
  4. LinuxOOM Killer机制

    2023-12-07 22:32:02       36 阅读
  5. Vue中NextTick。

    2023-12-07 22:32:02       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 22:32:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 22:32:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 22:32:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 22:32:02       20 阅读

热门阅读

  1. 详细解读python里的列表

    2023-12-07 22:32:02       36 阅读
  2. Flutter之MQTT使用

    2023-12-07 22:32:02       39 阅读
  3. 利用 Python 进行数据分析实验(七)

    2023-12-07 22:32:02       42 阅读
  4. 笙默考试管理系统-MyExamTest----codemirror(45)

    2023-12-07 22:32:02       28 阅读
  5. 什么是游戏原画?如何学游戏原画?

    2023-12-07 22:32:02       42 阅读
  6. git报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    2023-12-07 22:32:02       44 阅读