iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言面向对象编程中的封装是什么
  • 897
分享到

C语言面向对象编程中的封装是什么

2023-06-29 13:06:29 897人浏览 独家记忆
摘要

这篇文章主要介绍“C语言面向对象编程中的封装是什么”,在日常操作中,相信很多人在C语言面向对象编程中的封装是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言面向对象编程中的封装是什么”的疑惑有所帮助!

这篇文章主要介绍“C语言面向对象编程中的封装是什么”,在日常操作中,相信很多人在C语言面向对象编程中的封装是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言面向对象编程中的封装是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、面向对象基本概念

什么是对象?

此对象非彼对象,虽然有时候此对象又可以是你脑袋中的对象,那让我们从我们误解的对象开始了解吧,虽然我没有,但是用一下自己的直男思维,想想一个对象也是可以滴。那我就进入一下我这个直男脑袋中的对象吧!我有一个对象,这个对象呢,肤白貌美大长腿。用诗中的话就是“皓腕凝霜雪,垆边人似月”,美丽的江南女子,谁不喜欢呢。既然是想象,对象不只是仅仅是肤白貌美大长腿,还得爱你,在你寂寞的时候能陪你,在你难过时能在你身边,在你打游戏的时候不会无理取闹。这样的对象多好哇,简直就是梦中情人,可惜只存在想想中(叹气)。

通过上面的例子,想象中的对象,它具有了对象的特征,是不算非常符合人类的特性,易懂。那让我们从上面的例子提取出来对象的普遍特征。

特征一:属性

让我们回到我想象中的对象,对象是怎样的,皓腕凝霜雪,垆边人似月,这个是对象的属性,也就是样子。当然属性不只是样子啦,你可以添加更多的属性,比如声音好听,年龄20岁等等。

特征二:行为

对象具有的动作就是行为。在上面的例子就是,对象非常爱你,难过的时候能陪你,寂寞的时候也能陪你等等,就是这个对象具有的动作,对象能干什么。

对象与类

我们知道了对象是什么,但是你有没有发现这个对象是很广泛的,也就是我想象中的对象不知有一个,符合我想象中对象的特征可以多个,也就是我可以想象又很多个对象。我可以想象有”后宫佳丽三千人“,这三个都符合我对象的特征。这些特征就是类,也就是符合我想象的人不只是只有一个,可以有多个,只要这个人符合我想象的特征,她就是在这个类下面的。

那么类与对象的关系又是怎样的?对象就是符合这个类的特例,怎么理解呢?

在我的想象中,符合大美女的属性有很多,但是我不知道具体是谁,但是有一天我在动漫中看见了这个人,她叫小A。小A就是在大美女类下面的一个对象。又有一天,我又碰到一个人,也符合我定义的大美女,这个对象,她叫小B。小A和小B都是符合定义的,也就是在这个类下面的,而小A和小B是一个特例,也就是这个类下面的人,是独一无二的。

面向对象的编程方式

老生常谈,先简单看看面向过程的编程方式是怎样的?设想一个场景,刺激点的。有一天杰哥想你了,打算和你回家一起打电动,那他该怎么做才能邀请到你回家一起打电动?

面向过程的解决方式:简单点的方式简化一下

他首先西装革履,打扮的人模狗样,看起来十分帅气,小姐姐看了表示很赞

打车到你家

盛情邀约

面向对象的解决方式又是怎样的呢:我们看他邀请你涉及几个对象,打车对象,邀请对象,打电动对象,回家对象。那对象是怎么做的呢?那让我们看一下执行顺序:杰哥首先调用了打扮的对象进行了打扮,然后调用打车对象去了你家。到了你家后调用了邀请对象的行为发出了邀请,然后你调用了邀请对象的行为拒绝了杰哥,杰哥调用了情绪的对象的行为,发出了很难过的感觉。

打扮对象:

  • 行为:打扮

打车对象:

  • 属性:打车人

  • 属性:打车地点

  • 行为:上车

邀请对象:

  • 属性:邀请人

  • 属性:邀请结果

  • 行为1:接受

  • 行为2:拒绝

  • 行为3:发出邀请

回家对象:

  • 属性:回家的路

  • 属性:回家的时间

  • 行为:回家

情绪:

  • 属性:程度

  • 行为1:伤心

  • 行为2:难过

  • 行为3:非常难过

通过上面的例子,大概了解到了与面向过程的区别了,面向对象的编程方式的单元是对象,做了什么事情也是以对象执行动作。对象可以被很多对象调用,杰哥可以调用邀请对象中的邀请行为,你也可以调用邀请对象发出拒绝邀请的动作。对象的属性是怎样的,怎样定义是灵活的。

看到上面的例子:面向对象的编程方式=面向过程+面向对象。对象将某一些行为高度封装,然后由指挥官也就是我们自己按照自己的想法按照某个顺序调用(面向过程),在过程中,对象之间会进行一定的数据交互与一定的对象之间的行为调用。

再举个例子:实现一个循迹小车

构建对象:传感器 控制器 小车

小车对象:

  • 属性:当前偏移值

  • 行为:前进 ,后退 ,左转 ,右转

控制器:

  • 属性:输入值,输出值

  • 行为:计算控制值

传感器:

  • 属性:传感器测量值 传感器数量 传感器

  • 行为:测量

//伪代码void Follow_mark(void){调用传感器对象进行测量,将测量值保存到器测量值调用控制器对象,将传感器测量值作为输入参数,计算得到结果进行保存调用小车对象,根据控制传入的控制值,计算当前偏移量,然后根据偏移量调用左转/右转行为}

二、C语言实现面向对象

面向对象的三大特征

了解了面向对象的思想,思想是最重要的,特征是次要的。面向对象具有三大特征,我们或多或少都可以实现,java,pythonc++都有,但是C也是可以实现的,只是会比较麻烦,三大特征分别是封装,继承,多态。这三大特征能够帮助实现面向对象的编程,使得面向对象变得更优雅。我们先了解三大特征之三大特征之封装。

面向对象之封装

简介

封装就是将对象的特征进行封装,使之对象的属性和行为只能通过对象进行访问。在上面的例子中,邀请的对象,它的属性与行为是被封装好的,我们只能调用邀请这个对象才能调用邀请对象的行为。

优势:

隐藏内部细节,类似函数,只需要调用这个邀请对象的行为发出邀请,而不需要知道里面的底层实现

安全,复用性更好。对象的值都是被封装好的,隐藏掉的,一般是程序员只会提供相应的接口来访问,不能直接修改。复用性,从上面的例子,谁都可以调用对象的行为。

代码实现–基础版

基础版不涉及函数指针与函数表,先学习这个基础版的,理解好面向对象的最简单的封装的实现。

在实现前我们先想一想C到底有什么结构可以实现封装属性,各种属性。这个很简单,结构体嘛,能放各种类型的属性。

行为又怎么体现呢,可以实现各种行为,函数嘛。后面的多态会涉及函数指针,使用函数指针可以实现多态,这都是后面的事情,后面的文章会有简介。

那让我们做一个PID控制器的对象吧,如果不懂的小伙伴也没关系,这个只是控制器,有输入,输出,调试参数,了解这些就行了。具体实现过程,内部细节不懂也没关系,这个不重要,我代码会标出来的。

那我们直接阅读代码,进入困难模式:代码会有比较详细的注释,很容易看懂!

//开始构造对象,既然是控制器,对象必须具有输入,输出,调试参数//属性就是:参数值,输入值,输出值//行为就是:设置参数,查看参数,根据输入计算输出,构造对象,删除对象//属性:用结构体实现#include "stdio.h"#include <string.h>#include <stdlib.h>//控制器对象//控制器对象属性typedef struct {    int input;    int ouput;    int P_parameter,I_parameter,D_parameter;    int Sum_error;    int Last_error;}controller;//构造对象,初始化controller *Ctor_controller(void){      controller *temp;    temp=(controller *)malloc(sizeof(controller));    //清零    memset(temp,0,sizeof(controller));    return temp;}//删除对象void Del_ontroller(controller * const Me){    if(Me!=NULL) free(Me);}//设置控制器参数void Write_controller(controller * const Me,int P,int I,int D){    Me->P_parameter=P;    Me->I_parameter=I;    Me->D_parameter=D;}//读取控制器参数的值controller Read_controller(const controller * const Me,int P,int I,int D){    return (*Me);}//计算控制器输出,细节看不懂没关系,只需要知道传入的是偏差,就会有输出一个计算结果就行,这个结果能够帮助控制//至于偏差怎么定义什么时候需要用到PID控制器就知道了int Out_controller(controller * const Me,int input){    floatiIncpid=0;    int now_error=input;//当前偏差Me->Sum_error+=input;     //积分量限幅,方式积分饱和过深if(Me->Sum_error >500){Me->Sum_error = 500 ;}if(Me->Sum_error < -500){Me->Sum_error = -500 ;}    Me->ouput=Me->P_parameter * input                  // P         +Me->I_parameter * Me->Sum_error                // I         +Me->D_parameter * (now_error-Me->Last_error); // D    Me->Last_error=now_error;// 存储误差,用于下次计算    return(Me->ouput);           // 返回计算值    }int main(){    controller *test;    controller read_val;    //构造,创建一个对象    test=Ctor_controller();    //设置对象的值    Write_controller(test,1,1,1);    //查看对象的值    read_val=Read_controller(test,1,1,1);    printf("对象 P= %d I=%d D=%d \r\n",read_val.P_parameter,read_val.I_parameter,read_val.D_parameter);    //调用控制器一次:    printf("控制器输出=%d \r\n",Out_controller(test,100));    //删除/销毁一个对象    Del_ontroller(test);}

输出结果:

对象 P= 1 I=1 D=1 
控制器输出=300 

从上面的例子可以看出来,我直接调用对象,就可以实现封装,设置,查看等,注意使用了需要手动调用删除,不然容易出现内存泄漏,对象的生存时间就是我们程序员自己释放前的时间。

这里是使用堆的方式,容易出现内存溢出的情况,如果是单片机等其他资源较小的单元,可以使用其他方式构造对象,比如下面:对象的生存时间就是主函数的结束时间,编译器替我们释放了对象的资源,不需要我们主动进行释放。

#include "stdio.h"#include <string.h>#include <stdlib.h>//控制器对象//控制器对象属性typedef struct {    int input;    int ouput;    int P_parameter,I_parameter,D_parameter;    int Sum_error;    int Last_error;}controller;//构造对象,初始化void Ctor_controller(controller * const Me){      //清零    memset(Me,0,sizeof(controller));}//删除对象void Del_ontroller(controller * const Me){    ;}//设置控制器参数void Write_controller(controller * const Me,int P,int I,int D){    Me->P_parameter=P;    Me->I_parameter=I;    Me->D_parameter=D;}//读取控制器参数的值controller Read_controller(const controller * const Me,int P,int I,int D){    return (*Me);}//计算控制器输出,细节看不懂没关系,只需要知道传入的是偏差,就会有输出一个计算结果就行,这个结果能够帮助控制//至于偏差怎么定义什么时候需要用到PID控制器就知道了int Out_controller(controller * const Me,int input){    floatiIncpid=0;    int now_error=input;//当前偏差Me->Sum_error+=input;     //积分量限幅,方式积分饱和过深if(Me->Sum_error >500){Me->Sum_error = 500 ;}if(Me->Sum_error < -500){Me->Sum_error = -500 ;}    Me->ouput=Me->P_parameter * input                  // P         +Me->I_parameter * Me->Sum_error                // I         +Me->D_parameter * (now_error-Me->Last_error); // D    Me->Last_error=now_error;// 存储误差,用于下次计算    return(Me->ouput);           // 返回计算值    }int main(){    controller test;    controller read_val;    //构造,创建一个对象    Ctor_controller(&test);    //设置对象的值    Write_controller(&test,1,1,1);    //查看对象的值    read_val=Read_controller(&test,1,1,1);    printf("对象 P= %d I=%d D=%d \r\n",read_val.P_parameter,read_val.I_parameter,read_val.D_parameter);    //调用控制器一次:    printf("控制器输出=%d \r\n",Out_controller(&test,100));}

代码实现-进阶版

到进阶版,才能够完整的看到封装的实现,封装里面就具有了对象的属性与行为。这里我们通过函数指针访问对象的行为,我们可以通过函数指针访问对象的行为。

那具体行为是怎么实现的呢?实现是通过函数表中的函数指针来访问函数,以此来实现不同函数的调用,从而实现对象的行为。

那让我们看一下代码实现,然后分析指针指向就知道函数是怎么实现的。

头文件 :定义了对象的属性与行为

#ifndef __OOP_H#define __OOP_H//控制器对象struct controller_vtbl;typedef struct {    //对象属性        int input;    int ouput;    int P_parameter,I_parameter,D_parameter;    int Sum_error;    int Last_error;    //对象行为指针,通过指针访问函数    struct controller_vtbl *vptr;}controller;//对象的行为所在表,定义对象的行为在这里,通过定义函数指针指向需要实现对象行为的指针struct controller_vtbl{    controller * (*Ctor_controller)(void);    void         (*Del_controller)(controller * const Me);    controller   (*Read_controller)(const controller * const Me);    void         (*Write_controller)(controller * const Me,int P,int I,int D);    int          (*Out_controller)(controller * const Me,int input);};//对象行为函数controller * Ctor_controller(void);void Del_controller(controller * const Me);controller Read_controller(const controller * const Me);void Write_controller(controller * const Me,int P,int I,int D);int Out_controller(controller * const Me,int input);#endif

源文件::具体函数的行为属性的实现就在这里

//开始构造对象,既然是控制器,对象必须具有输入,输出,调试参数//属性就是:参数值,输入值,输出值//行为就是:设置参数,查看参数,根据输入计算输出,构造对象,删除对象//属性:用结构体实现#include "stdio.h"#include <string.h>#include <stdlib.h>#include "temp.h"//构造对象,初始化controller * Ctor_controller(void){      controller *ptr;    struct controller_vtbl *table;    ptr=(controller *)malloc(sizeof(controller));    table=(struct controller_vtbl *)malloc(sizeof(struct controller_vtbl));        //清零    memset(ptr,0,sizeof(controller));    table->Ctor_controller=&Ctor_controller;    table->Del_controller=&Del_controller;    table->Out_controller=&Out_controller;    table->Write_controller=&Write_controller;    table->Read_controller=&Read_controller;    ptr->vptr=table;    return ptr;}//删除对象/析构对象void Del_controller(controller * const Me){    if(Me!=NULL)     {        free(Me->vptr);        free(Me);    }}//设置控制器参数void Write_controller(controller * const Me,int P,int I,int D){    Me->P_parameter=P;    Me->I_parameter=I;    Me->D_parameter=D;}//读取控制器参数的值controller Read_controller(const controller * const Me){    return (*Me);}//计算控制器输出,细节看不懂没关系,只需要知道传入的是偏差,就会有输出一个计算结果就行,这个结果能够帮助控制//至于偏差怎么定义什么时候需要用到PID控制器就知道了int Out_controller(controller * const Me,int input){    floatiIncpid=0;    int now_error=input;//当前偏差Me->Sum_error+=input;     //积分量限幅,方式积分饱和过深if(Me->Sum_error >500){Me->Sum_error = 500 ;}if(Me->Sum_error < -500){Me->Sum_error = -500 ;}    Me->ouput=Me->P_parameter * input                  // P         +Me->I_parameter * Me->Sum_error                // I         +Me->D_parameter * (now_error-Me->Last_error); // D    Me->Last_error=now_error;// 存储误差,用于下次计算    return(Me->ouput);                          // 返回计算值    }int main(){    controller *test;    controller read_val;    //构造,创建一个对象,返回对象指针    test=Ctor_controller();    //设置对象的值     test->vptr->Write_controller(test,1,1,1);    //查看对象的值    read_val=test->vptr->Read_controller(test);    printf("对象 P= %d I=%d D=%d \r\n",read_val.P_parameter,read_val.I_parameter,read_val.D_parameter);    //调用控制器一次:    printf("控制器输出=%d \r\n",test->vptr->Out_controller(test,100));    //删除/销毁一个对象    test->vptr->Del_controller(test);}

运行结果:

对象 P= 1 I=1 D=1 
控制器输出=300 

可以看到,我们这次操作对象并不是直接调用函数,而是通过指针的方式来访问具体的哪个函数,而指针是在创建的对象里面的,这样就可以直接通过对象来访问它的行为。

后面实现多态也是使用了函数指针的方式,在多态里面这里的指针与行为表有了它自己的名字,就是虚指针与虚表。

到此,关于“C语言面向对象编程中的封装是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C语言面向对象编程中的封装是什么

本文链接: https://www.lsjlt.com/news/324933.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言面向对象编程中的封装是什么
    这篇文章主要介绍“C语言面向对象编程中的封装是什么”,在日常操作中,相信很多人在C语言面向对象编程中的封装是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言面向对象编程中的封装是什么”的疑惑有所帮助!...
    99+
    2023-06-29
  • 详解C语言面向对象编程中的封装
    目录前言一、面向对象基本概念什么是对象?对象与类面向对象的编程方式二、C语言实现面向对象面向对象的三大特征面向对象之封装简介代码实现–基础版代码实现-进阶版总结前言 面向...
    99+
    2024-04-02
  • Python面向对象编程之类的封装
    目录1、封装的理解2、私有类属性、公开类属性、私有实例属性和公开实例属性2.1 公开类属性2.2 私有类属性2.3 公开实例属性2.4 私有实例属性2.5 私有属性不一定真的私有3、...
    99+
    2024-04-02
  • C++中的面向对象编程概念是什么
    本篇文章给大家分享的是有关C++中的面向对象编程概念是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一.对象(Object),这个概念可以说是面向对象里面的最为核心的概念,...
    99+
    2023-06-17
  • PHP面向对象编程怎么对对象进行封装
    这篇文章主要讲解了“PHP面向对象编程怎么对对象进行封装”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP面向对象编程怎么对对象进行封装”吧!我们今天为大家介绍的是关于PHP面向对象编程的...
    99+
    2023-06-17
  • Python面向对象中封装的概念是什么
    这篇文章将为大家详细讲解有关Python面向对象中封装的概念是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一 封装的概念封装其实在我们的生活中处处都是,如电视机,电脑,手机等物品。我们通常只能看到其...
    99+
    2023-06-29
  • C++中面向对象编程指的是什么意思
    C++中的面向对象编程指的是一种程序设计范式,其中程序由对象组成,每个对象包含数据和操作数据的函数。面向对象编程的核心概念包括封装(...
    99+
    2024-03-11
    C++
  • PHP中的面向对象编程是什么?
    PHP是一种常用的编程语言,广泛应用于网络应用程序的开发中。在PHP的发展过程中,面向对象编程(OOP)成为其一个不可分割的组成部分。本文将介绍PHP中的面向对象编程是什么,其特点和应用场景。一、面向对象编程概述面向对象编程是一种编程范型,...
    99+
    2023-05-21
    PHP 面向对象编程 OOP
  • PHP中封装性与面向对象编程的关系
    在面向对象编程中,封装性是一个非常重要的概念。它允许开发者将数据和方法包装在一个类中,并通过对外提供接口来访问和操作数据,同时隐藏内部的实现细节。在PHP中,封装性与面向对象编程密不可分。封装性的主要目的是实现信息隐藏。通过将数据和方法封装...
    99+
    2023-10-21
    PHP 面向对象编程 封装性
  • 探索Go语言中的面向对象编程
    go语言支持面向对象编程,通过类型定义和方法关联实现。它不支持传统继承,而是通过组合实现。接口提供了类型间的一致性,允许定义抽象方法。实战案例展示了如何使用oop管理客户信息,包括创建、...
    99+
    2024-04-04
    go语言 面向对象
  • C#面向对象编程中的开闭原则是什么
    这篇“C#面向对象编程中的开闭原则是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#面向对象编程中的开闭原则是什么”文...
    99+
    2023-07-02
  • C++深入讲解类与对象之OOP面向对象编程与封装
    目录1.面向对象编程2.面向过程性编程和面向对象编程3.类的引入4.类的定义4.1类的两种定义方式4.1.1声明和定义全部放在类体中4.2.2.声明和定义不放在类体中5.类的访问限定...
    99+
    2024-04-02
  • golang函数在面向对象编程中的封装实现
    go 语言中通过函数实现面向对象封装。首先创建自定义类型定义对象,然后使用带有指针参数的函数封装方法。通过指针参数访问并修改对象状态,提高代码可重用性和可维护性。 Go 语言函数在面向...
    99+
    2024-05-02
    面向对象编程 封装 golang
  • Go语言的面向对象编程实践
    在 go 中,面向对象编程使用结构体和方法实现:定义一个结构体来表示自定义数据类型,包含数据字段。定义方法来操作和修改结构体实例,方法由接收器类型(即结构体)关联。使用结构体和方法管理数...
    99+
    2024-04-04
    go语言 面向对象
  • Java 封装与继承:面向对象的编程基础
    封装 封装是指将一个对象的内部细节与其外部接口分离。通过封装,我们可以控制对对象内部状态的访问,从而提高代码的安全性、可读性和维护性。 作用域:封装允许我们定义成员变量和方法的访问修饰符(如 private、protected 和 pu...
    99+
    2024-03-12
    面向对象编程(OOP)是计算机科学中广泛使用的一种编程范式 它以对象为基础。封装和继承是 OOP 中至关重要的概念 它们允许代码的可重用性、可维护性和灵活性。
  • 使用C语言怎么实现面向对象编程OOP
    本篇文章为大家展示了使用C语言怎么实现面向对象编程OOP,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。过程&对象?一个对象就是由或多或少的针对这个对象的过程构成的,当然其中是少不了必要的属性...
    99+
    2023-06-16
  • 面向对象编程是什么意思
    面向对象编程是一种编码设计,它使用数据来表示一组指令。它是一种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它由描述状态的属性和用来实现对象行为的方法组成,完成了从数据模型到处理模型的结合与统一。什么是面向对象编程?面向对象编...
    99+
    2023-07-17
  • Python面向对象中的封装详情
    目录一 封装的概念二 _ 和__ 对属性和方法的私有化1. 单下划线_2. 双下划线__3. 子类中访问父类的私有属性和私有方法三 访问及修改类的私有属性和私有方法1. 自定义公有方...
    99+
    2024-04-02
  • 如何学会面向对象编程语言
    这期内容当中小编将会给大家带来有关如何学会面向对象编程语言,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。面向对象编程语言的基础理论要点:学习基础理论要点,例如设计模式/范式,这样你就知道了在所有面向对象的...
    99+
    2023-06-17
  • C#面向对象编程中的接口隔离原则是什么
    本篇内容介绍了“C#面向对象编程中的接口隔离原则是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!接口隔离原则接口隔离原则(Interfa...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作