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 的形式,该形式下能够从外部调用对象的方法,但是却不能够从外部访问对象的数据,达到了封装的要求。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 跨平台socket封装是指为了在不同操作系统或者硬件平台上运行的应用程序之间进行网络通信,将socket API进行封装,提供统一的接口来使得应用程序可以方便地进行网络通信。由于在不同操作系统或者硬件平台上,socket API的实现方式有所不同,因此需要对不同平台进行适配和封装。跨平台socket封装的目的是方便开发人员进行网络通信,同时提高应用程序的可移植性、兼容性和可扩展性。在跨平台socket封装,可以使用一些开源的第三方库,比如Boost.Asio、libevent等。这些第三方库提供了一些封装接口,使得应用程序能够使用统一的方式来进行网络编程。 在使用跨平台socket封装时,需要注意以下几点: 1.不同操作系统之间可能存在差异,需要进行相应的适配和兼容性测试。 2.在进行网络通信时,要保证通信协议的一致性,避免数据传输出现丢包或者粘包等问题。 3.要充分理解每个函数的含义和参数,以保证网络编程的正确性和可靠性。 总之,跨平台socket封装为应用程序提供了简单、方便、可移植的网络编程方式,是现代网络通信的重要组成部分。 ### 回答2: 跨平台socket封装是一种将不同操作系统的socket细节进行封装的技术。通过跨平台socket封装,我们可以让不同操作系统的socket代码在不进行修改的情况下在不同的平台上运行。这样可以加快开发者的开发速度,同时降低代码维护难度。 跨平台socket封装技术的实现需要解决两个问题:一是不同操作系统对socket函数的实现细节不同,导致代码实现难度大,需要针对每个操作系统单独编写代码;二是跨平台socket封装技术需要充分考虑移植性问题,需要确保在不同操作系统和硬件平台上稳定运行。 为了解决这些问题,跨平台socket封装技术通常采用C或C++语言编写,使用平台无关的API,例如POSIX API或者Winsock API。同时,跨平台socket封装也需要具备跨平台的编译和构建环境,例如常用的Cmake或者Autotools。 跨平台socket封装的好处是显而易见的,它不仅可以提高开发者的效率,还可以降低代码维护的难度。但是需要注意的是,跨平台socket封装并不是万能的,它需要根据实际应用场景进行选择。如果仅仅是针对特定平台开发应用,使用原生的socket API可能更加简单有效。但是在开发跨平台应用或者框架时,使用跨平台socket封装技术是非常重要的。 ### 回答3: 跨平台socket封装是一种将底层的socket通信接口进行封装,使得在不同的操作系统以及开发语言实现socket通信更加简单和便捷的工具。封装后的跨平台socket可以隐藏底层操作系统的差异性,以统一的接口供用户使用,提高了代码的可复用性和跨平台移植性。 跨平台socket的封装可以通过使用库的方式进行实现,例如常见的Socket.io和Boost.asio库等。这些库提供了高层次的API,使得开发者不再需要关注不同平台和语言下socket通信的实现细节,而是可以直接调用封装好的API进行开发。同时,这些库也提供了众多的工具和函数,能够帮助开发者更加便捷的进行socket通信的开发和调试。 跨平台socket封装的优点不仅在于提高编程效率,还可以提高系统的灵活性和可扩展性。开发者可以更加方便地进行平台切换和升级,同时还可以通过简单的调用来实现多个设备之间的通信。 总之,跨平台socket封装的出现大大方便了软件开发工作,能够满足当今多样化、交互性强的移动互联网市场需求,为开发者提供了高效、可靠的网络通信解决方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值