首页 > 其他分享 >C语言实现封装特性

C语言实现封装特性

时间:2024-04-25 15:55:52浏览次数:13  
标签:NamedPoint 封装 name namedpoint 特性 C语言 char include

注:本文原型摘自《架构整洁之道》第5章 面向对象编程,经过作者加工修改

1. 封装特性

封装是面向对象编程的基本思想之一,通过采用封装特性,我们可以把一组相关联的数据和函数圈起来,使圈外面的代码只能看见部分函数,数据则完全不可见。

然而由于C++编译器必须知道每个类实例的大小,因此要求类的成员变量必须在该类的头文件中声明,这样反而违背了封装性。

反而非面向对象的C语言,可以通过一些手法实现完美的封装特性。

2. C实现封装举例

namedpoint.h 代码如下, 头文件对外声明NamedPoint类型的结构体,和4个相关的函数。
注意该头文件中,并未暴露NamedPoint的数据细节,即外部调用方只知道存在NamedPoint这个数据结构,但是无法得知NamedPoint内部数据是如何组织的。
外部模块只能通过头文件提供的4个函数去操作NamedPoint这个数据结构。

// namedpoint.h  
#ifndef __NAMEDPOINT_H__
#define __NAMEDPOINT_H__

typedef struct _NamedPoint NamedPoint;

NamedPoint* makeNamedPoint(int x, int y, char* name);
void setName(NamedPoint* p, char* name);
char* getName(NamedPoint* p);
double distance(NamedPoint* p1, NamedPoint* p2);

#endif

namedpoint.c 文件中实现了NamedPoint结构体的实现细节,和提供给外部调用的函数。
这里NamedPoint结构体的数据完全封装在namedpoint.c文件中,调用NamedPoint的模块是无法得知其内部数据的组织细节。

// namedpoint.c 
#include <stdlib.h>
#include <math.h>
#include "namedpoint.h"

struct _NamedPoint
{
    double x, y;
    char* name;
};


NamedPoint* makeNamedPoint(int x, int y, char* name)
{
    NamedPoint* p = malloc(sizeof(NamedPoint));
    p->x = x;
    p->y = y;
    p->name = name;
    return p;
}

void setName(NamedPoint* p, char* name)
{
    p->name = name;
}

char* getName(NamedPoint* p)
{
    return p->name;
}

double distance(NamedPoint* p1, NamedPoint* p2)
{
    double dx = p1->x - p2->x;
    double dy = p1->y - p2->y;
    return sqrt(dx * dx + dy * dy);
}

main.c中提供了调用示例,在main.c中,仅根据namedpoint.h头文件中提供的信息来使用NamedPoint类。

// main.c
#include <stdio.h>
#include <stdlib.h>
#include "namedpoint.h"


int main(void)
{
    NamedPoint* orgin = makeNamedPoint(0.0, 0.0, "orgin");
    NamedPoint* upperRight = makeNamedPoint(6.0, 8.0, "upperRight");

    printf("distance=%f\n", distance(orgin, upperRight));
    return 0;
}

调试执行结果如下:
执行结果

上面的例子中,NamedPoint类在namedpoint.c中实现数据组织和函数实现。在namedpoint.h中,仅提供了数据类型名,和外部接口函数,从外部并无法得知NamedPoint类内部数据的组织方式。main.c中使用NamedPoint类时,也仅通过接口使用,并无法知道其内部数据的组织方式。由此达到了比较理想的“封装”特性。

3. 总结

如上,虽然C并不是面向对象的编程语言,但是仍然以实现隐藏数据细节的方式,实现完美的封装效果。

标签:NamedPoint,封装,name,namedpoint,特性,C语言,char,include
From: https://www.cnblogs.com/TheShore/p/18157794

相关文章

  • CIRCLEQ_INSERT_AFTER, C语言循环队列
     CMakeLists.txt#CMakeList.txt:CMakeprojectforllist,includesourceanddefine#projectspecificlogichere.#cmake_minimum_required(VERSION3.2)#Addsourcetothisproject'sexecutable.add_executable(poj2823"main.c""......
  • C语言数据结构:链式栈及其出入栈
    /***********************************************************************************************************实现链式栈一般是以链表作为基础,一般是把链表头部作为栈顶,方便数据的插入和删除,链式栈相当于是一个单向不循环的链表。****Copyright(c)2023-2......
  • C语言数据结构:双向循环链表的增删操作
    /***********************************************************************************************************设计双向循环链表的接口****Copyright(c)[email protected]**********************************************......
  • dotnet 已知问题 错误标记 MethodImplOptions.InternalCall 特性参数将会在类型访问之
    本文将记录一个dotnet的已知问题。当自己不小心在方法上不正确标记了MethodImplAttribute特性时,错误选择了MethodImplOptions.InternalCall参数,那将会在运行的过程在,在此类型被访问之前就抛出了System.TypeLoadException异常,错误信息是Internalcallmethodwithnon_NUL......
  • C进阶总结一 -- <<C语言深度解剖>>
    C进阶总结--<<C语言深度解剖>>程序的本质:二进制文件运行程序,即将程序中的数据加载到内存中运行为什么要加载到内存?1.冯诺依曼体系决定2.快变量1.变量:内存上的某个位置开辟的空间因为变量都是程序运行起来才开辟的2.变量的初始化:变量的空间被开辟后,就应当具......
  • 1.C语言概述
    计算机语言发展史: 机器语言 汇编语言 高级语言(结构化+面向对象)C语言进化史: ALGOL60——CPL——BCPL——CB语言与C的关系: B是C语言的前一个版本 肯汤姆森用B语言写出了UNIX操作系统 丹尼斯里奇发明C,重写了UNIX操作系统C语言特点: 优:代码量小,速度......
  • 计算今天是该年的第几天(c语言实现)
    遇到一个有意思的编程题,使用C语言实现计算今天是该年的第几天。实现代码如下:#include<stdio.h>intd[12]={31,28,31,30,31,30,31,31,30,31,30,31};//将每月天数存在数组中(类似字典)intadd(intmonths,intflag,intdays)//计算天数{intnum=0,i=0;if(flag>0)//......
  • 第20章 高级Web服务特性
    1准备工作添加SuppliersController控制器。[ApiController][Route("api/[controller]")]publicclassSuppliersController:ControllerBase{privateDataContext_context;publicSuppliersController(DataContextdataContext)......
  • C语言单向循环链表的增删操作
    /***********************************************************************************************************设计单向循环链表的接口****Copyright(c)[email protected]**********************************************......
  • 数据结构笔试题——基于C语言的链表功能函数实现
    题目1题目要求如下:/***@functionname:LList_CntdmFind*@brief查找链表中,倒数第k个位置上的节点*@param:​ @Head:链表头节点​ @k :倒数第k个位置*@retval:int型返回值;返回-1时即为失败,返回0时表示成功;*@date:2024/04/23*@version1.0*@n......