浅谈类的封装

类的封装

实验介绍

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

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

为何封装 (why?)

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

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

封装的概念 (what?)

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

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

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

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

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

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

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

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

类的访问权限 (how?)

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

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

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

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

相关推荐
薄荷撞~可乐14 分钟前
C#高并发与并行理解处理
开发语言·c#
孤廖19 分钟前
【算法磨剑:用 C++ 思考的艺术・Dijkstra 实战】弱化版 vs 标准版模板,洛谷 P3371/P4779 双题精讲
java·开发语言·c++·程序人生·算法·贪心算法·启发式算法
躯坏神辉23 分钟前
c++怎么读取文件里的内容和往文件里写入数据
c++
sali-tec24 分钟前
C# 基于halcon的视觉工作流-章33-矩状测量
开发语言·人工智能·算法·计算机视觉·c#
凯子坚持 c29 分钟前
Redis 核心数据结构:String 类型深度解析与 C++ 实战
数据结构·c++·redis
芝士小宇31 分钟前
2025.9.12Qtday2
c++·qt
酷炫码神1 小时前
第 2 篇:Java 入门实战(JDK8 版)—— 编写第一个 Java 程序,理解基础运行逻辑
java·开发语言·策略模式
像风一样自由20201 小时前
Go语言详细指南:特点、应用场景与开发工具
开发语言·后端·golang
半夏知半秋1 小时前
基于跳跃表的zset实现解析(lua版)
服务器·开发语言·redis·学习·lua
Wyc724091 小时前
Lua语言基础笔记
开发语言·笔记·lua