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. Spring Boot入门学习必知道企业常用的Starter

    SpringBoot企业常用的 starter SpringBoot简介 SpringBoot运行 SpringBoot目录结构 整合JdbcTemplate @RestController 整合JS ...

  2. 【经典结构】单例模式Singleton

    单例模式Singleton 1.含义 单例模式:即一个类只能创建一个实例. 只有一个实例 --> 不可以从类外new对象 --> 构造器私有化private --> 从类里创建实例: ...

  3. 详述 IntelliJ IDEA 远程调试 Tomcat 的方法

    首先,配置remote: 如上图所示,点击Edit Configurations,进入如下界面: 如上图所示,我们进入了Run/Debug Configurations界面,然后点击左上角的+,选择R ...

  4. selenium3 + python - js&jquery操作处理

    # 推荐学习:https://www.w3school.com.cn/js/index.asp## 下面以简书登录&注册定位元素为例"""js定位 id name ...

  5. Requests方法 -- 关联用例执行

    1.参照此篇流程 :Requsts方法 -- Blog流程类进行关联 2.用例接口目录如下: 3.用例代码如下: import requestsimport unittestfrom Request. ...

  6. 2个Double字符串进行

    public static int compare(double d1, double d2) { if (d1 < d2) return -1; // Neither val is NaN, ...

  7. 浏览器WEB Browser 常识

    浏览器WEB Browser 浏览器发展史 浏览器诞生与发展 浏览器的诞生 早期浏览器 Netscape Internet Explorer 与浏览器战争 chrome的崛起 时代之泪 IE浏览器终成 ...

  8. mongodb(27017、28017)未授权访问

    重启docker systemctl restart docker.service 下载mingodb docker pull mongo:3.6 列出镜像 docker images mongo 创 ...

  9. ES6新特征

    1.块级作用域 {   }  就是块级作用域,还包括if.else.for.while...下都属于块级作用域. let 声明的变量不存在变量的提升,不允许let反复声明同一个变量:块级作用域下let ...

  10. Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用

    使用Dapr 客户端 处理服务调用,需要遵循的他的模式,通常代码是这个样子的: var client = DaprClient.CreateInvokeHttpClient(appId: " ...