C++ 中封装的含义和简单实现方式

 更新时间:2022年07月25日 09:57:45   作者:止步听风  
这篇文章主要介绍了C++ 中封装的含义和简单实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

其实封装并不是编程中的一个思想,对于很多领域来说都是这样。对于电子器件来说,我们不关心其内部的结构,只在乎该器件能够实现什么样的功能。这样对于顾客来说,不用花时间研究内部的实现过程,而对于商家来说,也可以更好的保护它们的商业秘密。

而对于 C++ 来说也是这样,借由数据类型也可以实现封装。这样做的好处就是对外屏蔽了功能实现,对内开放了数据权限。

C++ 中的类和对象是经由 C 中的 struct 发展而来的,就好像 struct 是由数组发展而来的一样。因此我们可以先通过 struct 实现封装。

封装实现

#include <iostream>
 
using std::cout;
using std::endl;
 
typedef struct complex
{
    int x;
    int y;
}COMP;
 
void init(COMP &tmp,int x,int y)
{
    tmp.x = x;
    tmp.y = y;
}
 
COMP * operator +(COMP &tmp1,COMP &tmp2)
{
    COMP *p = static_cast<COMP *>(new COMP);
    p->x = tmp1.x + tmp2.x;
    p->y = tmp1.y + tmp2.y;
    return p;
}
 
COMP * operator -(COMP &tmp1,COMP &tmp2)
{
    COMP *p = static_cast<COMP *>(new COMP);
    p->x = tmp1.x - tmp2.x;
    p->y = tmp1.y - tmp2.y;
    return p;
}
 
COMP * operator *(COMP &tmp1,COMP &tmp2)
{
    COMP *p = static_cast<COMP *>(new COMP);
    p->x = tmp1.x*tmp2.x - tmp1.y*tmp2.y;
    p->y = tmp1.x*tmp2.y + tmp1.y*tmp2.x;
    return p;
}
 
int main()
{
    COMP x,y;
    init(x,1,2);
    init(y,3,4);
    cout<<x.x<<" "<<x.y<<endl;
    cout<<y.x<<" "<<y.y<<endl;
 
    COMP *z;
    z = x+y;
    cout<<z->x<<" "<<z->y<<endl;
    delete z;
 
    z = x-y;
    cout<<z->x<<" "<<z->y<<endl;
    delete z;
 
    z = x*y;
    cout<<z->x<<" "<<z->y<<endl;
    delete z;
 
    return 0;
}

结果为:

1 2
3 4
4 6
-2 -2
-5 10

上面的程序使用 struct 构建了类似复数的结果,并使用运算符重载实现了复数的加、减、乘运算。这样如果我们要进行复数的运算的话,可以直接使用 +-* 而不用具体关心内部的实现过程,因为我们在意的只是结果的正确性。

封装属性

封装的作用就像之前提到的那样:对外提供接口,对内提供数据。

虽然上边的函数在全局构建了接口函数,但是却也暴露了函数的实现过程,并且我们还能够在外部直接访问 struct 内的数据,这并不是我们想要的封装形式。这是由 struct 的性质决定的,在 C++ 中,提供了 class 的形式实现整个的封装过程。

struct 和 class 的不同在于,struct 中的数据和方法都是 public 的,而 class 中的数据和方法却是可以自定义的:

 

属性内部外部
publicyes

yes

protectedyesno
privateyesno

protected 和 private 的区别在继承形式上。

class 封装

对于上边的 complex,如果使用 class 来封装:

#include <iostream>
 
using std::cout;
using std::endl;
 
class complex
{
public:
    complex()
    {
        this->x = 0;
        this->y = 0;
    }
 
    complex(int x, int y):x(x),y(y){}
 
    complex * operator +(complex &tmp)
    {
        complex *p = static_cast<complex *>(new complex);
        p->x = this->x + tmp.x;
        p->y = this->y + tmp.y;
        return p;
    }
 
    complex * operator -(complex &tmp)
    {
        complex *p = static_cast<complex *>(new complex);
        p->x = this->x - tmp.x;
        p->y = this->y - tmp.y;
        return p;
    }
 
    complex * operator *(complex &tmp)
    {
        complex *p = static_cast<complex *>(new complex);
        p->x = this->x*tmp.x - this->y*tmp.y;
        p->y = this->x*tmp.y + this->y*tmp.x;
        return p;
    }
 
    void display()
    {
        cout<<this->x<<" "<<this->y<<endl;
    }
 
private:
    int x;
    int y;
};
 
 
int main()
{
    complex x(1,2),y(3,4);
    x.display();
    y.display();
 
    complex *z;
    z = x+y;
    z->display();
    delete z;
 
    z = x-y;
    z->display();
    delete z;
 
    z = x*y;
    z->display();
    delete z;
 
    return 0;
}

结果为:

1 2
3 4
4 6
-2 -2
-5 10

上边的程序使用 class 的概念封装了 complex 的形式,该形式下能够从外部调用对象的方法,但是却不能够从外部访问对象的数据,达到了封装的要求。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++ STL入门教程(3) deque双向队列使用方法

    C++ STL入门教程(3) deque双向队列使用方法

    这篇文章主要为大家详细介绍了C++ STL入门教程第三篇,deque双向队列的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • C/C++之long int与long long的区别及说明

    C/C++之long int与long long的区别及说明

    这篇文章主要介绍了C/C++之long int与long long的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 简单了解C语言中直接插入排序与直接选择排序实现

    简单了解C语言中直接插入排序与直接选择排序实现

    这篇文章主要介绍了C语言中直接插入排序与直接选择排序实现,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,需要的朋友可以参考下
    2016-03-03
  • C语言中的函数指针基础学习教程

    C语言中的函数指针基础学习教程

    这篇文章主要介绍了C语言中的函数指针基础学习教程,包括函数指针作为参数来传递等重要知识,需要的朋友可以参考下
    2016-04-04
  • 浅析C++标准库元组(tuple)源码

    浅析C++标准库元组(tuple)源码

    这篇文章主要介绍了C++标准库元组(tuple)源码,介绍了什么是元组以及用法,并进行了源码分析,需要的朋友可以参考下
    2015-08-08
  • 常用排序算法的C语言版实现示例整理

    常用排序算法的C语言版实现示例整理

    这篇文章主要介绍了常用排序算法的C语言版实现示例整理,包括快速排序及冒泡排序等,基本上都给出了时间复杂度,需要的朋友可以参考下
    2016-03-03
  • 教你如何使用C++ 统计地铁中站名出现的字的个数

    教你如何使用C++ 统计地铁中站名出现的字的个数

    通过本文教大家如何使用C++ 统计地铁中站名出现的字的个数,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-01-01
  • 一文详解Qt如何读取和写入配置文件的数据

    一文详解Qt如何读取和写入配置文件的数据

    这篇文章主要为大家详细介绍了在Qt中如何实现读取和写入配置文件的数据,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C++实现LeetCode(127.词语阶梯)

    C++实现LeetCode(127.词语阶梯)

    这篇文章主要介绍了C++实现LeetCode(127.词语阶梯),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 一文详解C++ 智能指针的原理、分类及使用

    一文详解C++ 智能指针的原理、分类及使用

    智能指针的本质就是使用一个对象来接管一段开辟的空间,这篇文章就来给大家介绍介绍C++智能指针的原理,分类及使用方法,文中有详细的代码示例,需要的朋友可以参考下
    2023-05-05

最新评论