C语言也能面向对象?不是C++是面向对象的么?其实C语言也能抽象成简单的面向对象方法,在Linux内核源码当中,底层的驱动代码、文件系统等皆采用了面向对象的封装技术,这样的好处是将客观的东西抽象出来,以接口的方式管理。
  C++完全包容C语言的语法特点,C++中类:class和C语言中的结构体:struct是等效的,不过C++是一种完全面向对象的模式,其中域、对象名,都封装在类里面,而C语言没有明确规定,只是结构体是一种根据设计需要来构造的一种特殊的数据类型。C++中每个类都提供一个默认的构造函数和析构函数(当然也可以自定义一个构造函数)。下面是用纯C语言实现一个C++的vector容器:

  1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <assert.h>
4 #include <string.h>
5 typedef int DataType;
6 typedef struct array
7 {
8 DataType *Data;
9 int size,max_size;
10   void (*Constructor)(struct array *);//构造函数
11 void (*Input)(DataType ,struct array *);//输入数据
12   int (*get_array_size)(struct array *);//获取arr的大小
13   int (*return_index_value)(struct array *,int);//返回下标为index的值
14 void (*print)(struct array *);//打印结果
15 void (*Destructor)(struct array *);//析构函数
16 }Array;
17
18 void Init(Array *this);
19 void _print(struct array *this);
20 void _constructor(Array *this);
21 void _denstructor(Array *this);
22 void _input(DataType data,Array *this);
23 int _get_szie(Array *this);
24 int _return_index_value(Arrary *this,int index);
25
26 void Init(Array *this)
27 {
28 this->Input =_input;
29 this->print =_print;
30   this->get_array_size = _get_size;
31   this->return_index_value = _return_index_value;
32 this->Constructor =_constructor;
33 this->Destructor =_denstructor;
34 this->Constructor(this);
35 }
36
37 void _constructor(Array *this)
38 {
39 this->size=0;
40 this->max_size=10;
41 this->Data=(DataType *)malloc(this->max_size*sizeof(DataType));
42 memset(this->Data,0,10);
43 }
44
45 void _input(DataType data, Array *this)
46 {
47 int i;
48 DataType *ptr;
49
50 if(this->size >= this->max_size)
51 {
52 this->max_size +=10;
53 ptr=(DataType *)malloc(this->max_size*sizeof(DataType));
54 for(i=0;i<this->size;i++)
55 ptr[i]=this->Data[i];
56 free(this->Data);
57 this->Data=ptr;
58 }
59 this->Data[this->size]=data;
60 this->size +=1 ;
61 }
62
63 void _print(struct array *this)
64 {
65 assert(this != NULL);
66 struct array *ptr=this;
67 int i=0;
68 for(i=0;i<ptr->size;i++)
69 printf("data is %d\n",ptr->Data[i]);
70
71 return ;
72 }
73 int _get_array_size(Array *this)
74 {
75   assert(this != NULL);
76   return this->size+1;
77 }
78 int _return_index_value(Array *this,int index)
79 {
80   assert(this != NULL);
81   return (this->Data[index]);
82 }
83 void _denstructor(Array *this)
84 {
85 int i=0;
86   assert(this != NULL);
87 for(i=0;i<this->max_size;i++)
88 this->Data[i]=0;
89 free(this->Data);
90 }
91
92 int main()
93 {
94 Array MyArray;
95
96 Init(&MyArray); //使用对象前必须初始化,间接调用构造函数
97 // MyArray.Data[]={1,2,3,4,5};
98 MyArray.Input(1,&MyArray);
99 MyArray.Input(2,&MyArray);
100 MyArray.Input(3,&MyArray);
101 MyArray.Input(4,&MyArray);
102 MyArray.Input('5',&MyArray);
103 MyArray.print(&MyArray);
104   printf("the array size is :%d\n",MyArray.get_array_size(&MyAarray));
105   printf("the index value in array is:%d\n",MyArray.return_index_value(&MyArray,3));
106 MyArray.Destructor(&MyArray); //使用对象后必须显式调用析构函数
107
108 return 0;
109 }
 

C语言实现类似C++的容器vector的更多相关文章

  1. 2.2 C语言_实现数据容器vector(排序功能)

    上一节我们说到我们己经实现了一般Vector可以做到的自动扩充,告诉随机存取,那么现在我们需要完成vector的一个排序的功能. 排序算法我们网上一百度哇~~!很常见的就有8大排序算法: 1.选择排序 ...

  2. C语言如何实现继承及容器

    继承的概念 继承是面向对象软件技术当中的一个概念,与多态.封装共为面向对象的三个基本特征.继承可以使得子类具有父类的属性和方法或者重新定义,追加属性和方法. 面向对象中的重要概念就是类,在我们熟知的编 ...

  3. C++线性序列容器<vector>简单总结

    C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除 ...

  4. [C++]STL容器Vector的内存释放

    直接抛出两句话,说明到底应该如何释放Vector占用的内存. “vector的clear不影响capacity,你应该swap一个空的vector.” <Effective STL>中的“ ...

  5. STL标准库-容器-vector

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...

  6. C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用

    序列性容器::(vector和list和deque)   erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被   删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...

  7. 从零开始写STL—容器—vector

    从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...

  8. C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器

    课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...

  9. C++ 顺序容器(vector,list、deque,stack,queue)

    顺序容器的种类有:vector,list.deque 顺序容器适配器: stack     //先进后出   栈 queue   //先进先出   队列 priority_queue   //也优先管 ...

随机推荐

  1. Command 'ifconfig' not found, but can be installed with: sudo apt install net-tools VM Ubuntu 解决方案

    VMware下安装的Ubuntu 一开始由于Firefox连不上网,然后通过看了https://www.bbsmax.com/A/VGzlEGYJbq/这个文章之后,自己也测了一下,确实好用 但是if ...

  2. 字符串的模式匹配算法——KMP模式匹配算法

    朴素的模式匹配算法(C++) 朴素的模式匹配算法,暴力,容易理解 #include<iostream> using namespace std; int main() { string m ...

  3. 初探SpringRetry机制

    重试是在网络通讯中非常重要的概念,尤其是在微服务体系内重试显得格外重要.常见的场景是当遇到网络抖动造成的请求失败时,可以按照业务的补偿需求来制定重试策略.Spring框架提供了SpringRetry能 ...

  4. python基础之面向对象OOP

    #类(面向对象) PageObject设计模式 unittest 知识体系#函数式编程import datetimebook_info = { "title":"Pyth ...

  5. 怀疑前端组件把我的excel文件搞坏了,怎么证明

    背景 我在做个需求,用户通过excel上传文件,文件中,每一行就是一条数据,后台批量处理:但是呢,用户填的数据可能有问题,所以我后台想先做个检查,然后在每一行中加一列,来指出这一行存在的问题. 我本来 ...

  6. 锁屏面试题百日百刷-java大厂八股文(day3)

    为了有针对性的准备面试,锁屏面试题百日百刷开始每日从各处收集的面经中选择几道经典面试题分享并给出答案供参考,答案中会做与题目相关的扩展,并且可能会抛出一定问题供思考.这些题目我会标注具体的公司.招聘类 ...

  7. Mac终端美化(iterm2+zsh+oh-my-zsh+powerlevel10k)

    iterm2+zsh+oh-my-zsh+powerlevel10k 一.下载iterm2 方式一:官网下载 https://iterm2.com/ 方式二:百度云下载 链接: https://pan ...

  8. Python基础之用PyQt5创建menu

    前一篇文章中,我们已经安装了PyQt5,并且已经测试过可用.那么接下来第一步开始学习如何创建菜单. 第一步:在想要运行py的地方右击External Tools-->designer,打开des ...

  9. Vue项目发布的问题--http://localhost:8088/static/fonts/fontawesome-webfont.af7ae50.woff2

    问题:ngnix将8080转成80对外访问,找不对woff2等文件 一\ 搭建环境 ngnix-->conf中 server { listen 80; server_name 10.9.240. ...

  10. 学习笔记-CCS-MSP430F5529[快速入门篇一]

    由于最近竞赛需要使用TI公司的MSP430系列芯片,本人在最近两天匆忙的学习了一下MSP430F5529(下文统一称作5529)的使用.写下本文是为了将这两天学习内容做一个复习,并且将学习过程中遇到的 ...