浅谈类的封装

类的封装

实验介绍

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

  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 等,本次实验却又单独拿出来讲,这是因为强调 “封装”,就像我们经常听一首歌却叫不出歌名一样,现在正式告诉你 “歌名”。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ALONE_WORK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值