首页 > 编程语言 >c++数据封装

c++数据封装

时间:2024-10-27 14:21:28浏览次数:3  
标签:封装 int private 访问 c++ 数据 public

C++ 数据封装

数据封装(Data Encapsulation)是面向对象编程(OOP)的一个基本概念,它通过将数据和操作数据的函数封装在一个类中来实现。这种封装确保了数据的私有性和完整性,防止了外部代码对其直接访问和修改。

所有的 C++ 程序都有以下两个基本要素:

  • 程序语句(代码):这是程序中执行动作的部分,它们被称为函数。
  • 程序数据:数据是程序的信息,会受到程序函数的影响。

封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。数据封装引申出了另一个重要的 OOP 概念,即数据隐藏

数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。

C++ 通过创建来支持封装和数据隐藏(public、protected、private)。我们已经知道,类包含私有成员(private)、保护成员(protected)和公有成员(public)成员。默认情况下,在类中定义的所有项目都是私有的。例如:

class Box { public: double getVolume(void) { return length * breadth * height; } private: double length; // 长度 double breadth; // 宽度 double height; // 高度 };

变量 length、breadth 和 height 都是私有的(private)。这意味着它们只能被 Box 类中的其他成员访问,而不能被程序中其他部分访问。这是实现封装的一种方式。

为了使类中的成员变成公有的(即,程序中的其他部分也能访问),必须在这些成员前使用 public 关键字进行声明。所有定义在 public 标识符后边的变量或函数可以被程序中所有其他的函数访问。

把一个类定义为另一个类的友元类,会暴露实现细节,从而降低了封装性。理想的做法是尽可能地对外隐藏每个类的实现细节。

访问修饰符:

  • private: 私有成员只能在类的内部访问,不能被类的外部代码直接访问。
  • public: 公有成员可以被类的外部代码直接访问。
  • protected: 受保护成员可以被类和其派生类访问。

数据封装的实例

C++ 程序中,任何带有公有和私有成员的类都可以作为数据封装和数据抽象的实例。请看下面的实例:

实例

#include <iostream> using namespace std; class Adder{ public: // 构造函数 Adder(int i = 0) { total = i; } // 对外的接口 void addNum(int number) { total += number; } // 对外的接口 int getTotal() { return total; }; private: // 对外隐藏的数据 int total; }; int main( ) { Adder a; a.addNum(10); a.addNum(20); a.addNum(30); cout << "Total " << a.getTotal() <<endl; return 0; }

当上面的代码被编译和执行时,它会产生下列结果:

Total 60

上面的类把数字相加,并返回总和。公有成员 addNum 和 getTotal 是对外的接口,用户需要知道它们以便使用类。私有成员 total 是对外隐藏的,用户不需要了解它,但它又是类能正常工作所必需的。

数据封装通过类和访问修饰符(public, private, protected)来实现,以下是一个简单的例子:

实例

#include <iostream>
using namespace std;

class Student {
private:
    string name;
    int age;

public:
    // 构造函数
    Student(string studentName, int studentAge) {
        name = studentName;
        age = studentAge;
    }

    // 访问器函数(getter)
    string getName() {
        return name;
    }

    int getAge() {
        return age;
    }

    // 修改器函数(setter)
    void setName(string studentName) {
        name = studentName;
    }

    void setAge(int studentAge) {
        if (studentAge > 0) {
            age = studentAge;
        } else {
            cout << "Invalid age!" << endl;
        }
    }

    // 打印学生信息
    void printInfo() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    // 创建一个 Student 对象
    Student student1("Alice", 20);

    // 访问和修改数据
    student1.printInfo();

    student1.setName("Bob");
    student1.setAge(22);

    student1.printInfo();

    return 0;
}

设计策略

通常情况下,我们都会设置类成员状态为私有(private),除非我们真的需要将其暴露,这样才能保证良好的封装性

这通常应用于数据成员,但它同样适用于所有成员,包括虚函数。

数据封装的优点

  • 数据隐藏: 通过将数据成员声明为私有,防止外部代码直接访问这些数据。
  • 提高代码可维护性: 提供公共方法来访问和修改数据,这使得可以在不影响外部代码的情况下修改类的内部实现。
  • 增强安全性: 防止不合法的数据输入和不当的修改操作。
  • 实现抽象: 提供了一种机制,使得用户不需要了解类的内部实现细节,只需要了解如何使用类的公共接口即可。

标签:封装,int,private,访问,c++,数据,public
From: https://blog.csdn.net/Programmersa/article/details/143267239

相关文章

  • C++的继承和多态
    继承继承的本质意义是复用(不用写就有)父类的某些东西可以直接使用eg.但是注意:被继承的成员是新的成员,不是共用同一个成员(实例化的成员变量不同)         但是调用的函数是同一个函数继承基类成员访问方式的变化(重点)private访问 "在派......
  • 数据结构~红黑树
    文章目录一、红黑树的概念二、红黑树的定义三、红黑树的插入四、红黑树的平衡五、红黑树的验证六、红黑树的删除七、完整代码八、总结一、红黑树的概念红黑树是一棵二叉搜索树,他的每个结点增加⼀个存储位来表示结点的颜色,可以是红色或者黑色。通过对任何⼀条从根到......
  • MYSQL数据库表
    MYSQL完整性约束1.实体完整性(1)主码(PRIMARYKEY)约束主码约束是指在表中定义一个主码,它的值用于唯一标识表中的每一行数据。若关系中的一个属性或属性组的值能够唯一地标识一个元组,且他的子集不能唯一的标识一个元组,则称这个属性或属性组做候选码。候选码特性:唯一性:唯......
  • 什么是数据映射
    数据映射是将一组数据转换并整合进另一组数据的过程、数据整合、数据转换、提高数据兼容性和互操作性的关键技术手段。在详细描绘中关于数据转换的具体内容,它是数据映射中不可或缺的步骤。数据从源格式变换到目标格式时,需要遵循特定的规则和逻辑,以确保信息在转换过程中保持准确性......
  • C++11新标准の右值引用
    一、什么是左值、右值?专业的说法:左值是指表达式结束后依然存在的持久化对象;右值是指表达式结束后就不再存在的临时对象。通俗的说法:有名字的对象都是左值,右值没有名字。区分左右值得便捷方法:看能不能对表达式取地址,如果能,则为左值,否则为右值Tips:C++11把右值分为纯右值和......
  • 数据结构与算法——Java实现 46. 从前序与中序遍历序列构造二叉树
    努力的意义大概就是当好运来临的时候你觉得你值得                                                ——24.10.24105.从前序与中序遍历序列构造二叉树给定两个整数数组 preorder 和 inorder ,其中 preorder 是......
  • Chromium127调试指南 Windows篇 - 安装C++扩展与配置(五)
    前言在前面的文章中,我们已经安装了VisualStudioCode(VSCode)并配置了基本的扩展。现在,我们将进一步优化我们的开发环境,重点关注C++相关的依赖扩展。这些扩展对于在VSCode中高效开发和调试Chromium项目至关重要。此外,我们还将学习如何使用gn工具生成VisualStudio2022的项目......
  • 数据挖掘与机器学习入门-以房价预测为例
    数据挖掘与机器学习入门-以房价预测为例背景此时我们有两份CSV文件houseprice_train.csv:包含训练数据和房价数据houseprice_test.csv:只包含测试数据不包括房价,将测试集真正房价对开发者不可见用于打分数据处理导入两份csv文件:train=pd.read_csv('houseprice_train.cs......
  • 【保姆级IDF】ESP32最强WIFI模式:AP+STA,实现数据中继站
    Tips:抛砖引玉,本文记录ESP32学习过程中遇到的收获。如有不对的地方,欢迎指正。目录1.前言2.实现功能3.代码思路4.代码讲解4.1AP_STA模式下的其他设备接入以及接入其他设备的WIFI配置4.2自身作为AP和STA模式下的不同套接字的创建及配置4.3WIFI事件中被调用的接受......
  • CSP/信奥赛C++刷题训练:经典二分例题(2):洛谷P1678:烦恼的高考志愿
    CSP/信奥赛C++刷题训练:经典二分例题(2)烦恼的高考志愿题目背景计算机竞赛小组的神牛V神终于结束了高考,然而作为班长的他还不能闲下来,班主任老t给了他一个艰巨的任务:帮同学找出最合理的大学填报方案。可是v神太忙了,身后还有一群小姑娘等着和他约会,于是他想到了同为计......