C语言如何写类实现教程示例

目录
  • 引言
  • 操空MYSQL的C程序
  • 定义个 联合体+结构体 类型 Parameter

引言

以前用C++BUILDER  写类非常爽.

类把涉及数据相关的操作打包成一个类.

然后后期开发工程师可以继承啊, 这样提升了开发效率.

不过C语言注重的是执行效率, 类的继承会导致内存的浪费,可能导致性能不佳!

最近继续完善我那个小C,大家还记得小C妹子吗?

操空MYSQL的C程序

对她 就是操空MYSQL的C程序, 我叫她去干删除日志表的工作!

不过最近要对她增加适应工作环境,有的环境需要CA证书,比如说RDS,亚马逊,以及MYSQL自己的证书.

所以对原本的参数需要增加3项. 另外的就是原本参数使用的是数组,无法动态根据实际参数大小来存储.有时候浪费很多内存,有的时候数组不会存储结尾字符'\0' 比如说参数 char is_ssl[3]; 如何是no则没有问题,YES倒是有问题.丢失了结尾符号.在后面比较的时候就无法判断了.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

#define KEYSIZE 15

typedef struct 
{
 union {
  struct {    
            char* ip;
            char* user;
            char* port;
            char* passwd;
            char* schema;
            char* table_name;
            char* limit_rows;
            char* total_sql;
            char* del_sql;
            char* logfile;
            char* is_ssl;
            char* client_cert;
            char* client_key;
            char* ca_cert;
            char* is_debug; 
            }  ;
   char *pArr[KEYSIZE];
 };             
} Parameter;

typedef struct
{
  Parameter param;
  void (*init) (Parameter* param );
  void (*free) (Parameter* param );
}TParameter;

//---------------------------------------------------------------------------------------------------------------------

void init_Paramter(Parameter* param )
{
  for(int i=0;i<KEYSIZE; i++)
 {
    param->pArr[i]=NULL;
 }
}   

//---------------------------------------------------------------------------------------------------------------------
void free_Parameter(Parameter* param )
{
 for (int i=0;i<KEYSIZE;i++)
 {
    free (param->pArr[i]);
    param->pArr[i]=NULL;
 }
}

int main()
{
  TParameter ParamObj;
  ParamObj.init=init_Paramter;
  ParamObj.free=free_Parameter; 
  ParamObj.init(&ParamObj.param);

  ParamObj.param.ip= calloc(sizeof(char),strlen("192.168.0.155")+1);
  strcpy(ParamObj.param.ip,"192.168.0.155");
  
  printf("ParamObj.IP:%s\n",ParamObj.param.ip);
  printf("ParamObj.IP Length:%d\n",strlen(ParamObj.param.ip));
  ParamObj.free(&ParamObj.param);
    return 0;
}

定义个 联合体+结构体 类型 Parameter

该类型 里面有个联合体 字符指针数组 ; 外加一个结构体参数;

数组的作用就是遍历结构体里面的指针, 从而可以初始化和释放内存操作

然后我们再套个结构体类型. 把 Parameter 设置成了数据成员,

另外我们再定义两个函数指针成员.

这样我们的类就定义完成了.

接着我们在主函数里面 定义类的 参数对象

TParameter ParamObj;

这里是C 不像C++ 我们需要手工关联 函数指针成员. 说白点就是给它赋值

关联上具体函数地址.

ParamObj.init=init_Paramter; 
 ParamObj.free=free_Parameter;

接着我们通过函数来初始化我们的参数数据

ParamObj.init(&ParamObj.param);

然后就是我们正式的对数据成员动态分配堆内存

ParamObj.param.ip= calloc(sizeof(char),strlen("192.168.0.155")+1);

strcpy(ParamObj.param.ip,"192.168.0.155");

接下来就是 对数据成员的使用

printf("ParamObj.IP:%s\n",ParamObj.param.ip);  
printf("ParamObj.IP Length:%d\n",strlen(ParamObj.param.ip));

最后我们释放数据成员的内存

ParamObj.free(&ParamObj.param);

我们一般都定义为址传给函数; 因为这样非常快; 传内存地址 也就是4-8字节

而传值 就大于8字节;

strlen(ParamObj.param.ip) 就13个字节!

C语言菜单

C语言的野指针

VSCODE 从相恋到分手

以上就是C语言如何写类实现教程示例的详细内容,更多关于C语言如何写类的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言编程基础char类型转换示例

    代码 如下所示: #inlcude <stdio.h> void func1(void) { char a = 0x7F; unsigned char b = a; unsigned int c = a; printf ("a: %d(0x%x)\n", a, a); // a: 127(0x7f) printf ("b: %d(0x%x)\n", b, b); // b: 127(0x7f) printf ("c: %d(0x%x)\n&qu

  • C语言操作符进阶教程(表达式求值隐式类型转换方法)

    目录 结构体 表达式求值 隐式类型转换 意义: 方法 算术转换 操作符属性 结构体 结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错,而且c语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换. 涉及结构体的操作符这里讲两个:. (结构体访问操作符)-> () 首先写一段代码: int main() { struct Stu s = {"me",19,60}; prinft("%s %d %lf",s.who,s.age

  • C语言基础隐式类型转换与强制类型转换示例解析

    目录 类型转换 隐式类型转换 强制类型转换 类型转换 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题. 转换包括隐式类型转换和强制类型转换. 类型转换的原则:占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低. 隐式类型转换 隐式转换也称为自动转换,遵循一定的规则,由编译器自动完成. C的整型算数运算总是至少以缺省整型类型的精度来进行,为了获得这个精度,表达式中的字符和短整形操作数在使用之前都被转换成普通整型,这种转换为整型提升.

  • C语言函数基础教程分类自定义参数及调用示例详解

    目录 1.  函数是什么? 2.  C语言中函数的分类 2.1 库函数 2.1.1 为什么要有库函数 2.1.2 什么是库函数 2.1.3 主函数只能是main()吗 2.1.4常见的库函数 2.2 自定义函数 2.2.1自定义函数是什么 2.2.2为什么要有自定义函数 2.2.3函数的组成 2.2.4 举例展示 3. 函数的参数 3.1 实际参数(实参) 3.2  形式参数(形参) 4. 函数的调用 4.1 传值调用 4.2  传址调用 4.3 练习 4.3.1. 写一个函数判断一年是不是闰年

  • C语言数据类型枚举enum全面详解示例教程

    目录 一.枚举类型的定义 二.枚举类型的使用 2.1创建变量 2.2一些优点 总结 一.枚举类型的定义 enum Day//enum Day是一种类型 { Mon,//周一到周日这些叫枚举的可能取值,也叫枚举常量 Tue, Wed, Thur, Fri, Sat, Sun, }; 上述代码定义的enum Day是一种枚举类型,{}中内容是枚举类型的可能取值,也可叫作枚举常量. 这些枚举常量都是有值的,默认从0开始,依次往后递增1,如果你愿意赋值也是可以的. 代码如下: #include<stdi

  • C语言如何写类实现教程示例

    目录 引言 操空MYSQL的C程序 定义个 联合体+结构体 类型 Parameter 引言 以前用C++BUILDER  写类非常爽. 类把涉及数据相关的操作打包成一个类. 然后后期开发工程师可以继承啊, 这样提升了开发效率. 不过C语言注重的是执行效率, 类的继承会导致内存的浪费,可能导致性能不佳! 最近继续完善我那个小C,大家还记得小C妹子吗? 操空MYSQL的C程序 对她 就是操空MYSQL的C程序, 我叫她去干删除日志表的工作! 不过最近要对她增加适应工作环境,有的环境需要CA证书,比如

  • 手写vite插件教程示例

    目录 前言 1. 什么是 vite 插件 2. 为什么要写 vite 插件 创建  vite 插件通用模板 1. 初始化 2. 配置 eslint 和 prettier(可选) 3. 新增 src/index.ts 入口 4. 创建 examples 目录 5. 配置 examples/vite-vue3 项目 6. 安装 tsup 配置运行命令 7. 开发环境运行 8. 发布 vite 的插件钩子 hooks 们 1. vite 独有的钩子 2. vite 与 rollup 的通用钩子之构建阶

  • C语言手写集合List的示例代码

    目录 前沿 定义结构 创建List 扩容 创建数据节点 给集合添加值 删除集合内指定的值 删除集合内指定下标的值 打印集合 迭代器 查询指定元素的下标(第一个) 末尾查询指定元素下标(第一个) 判断数组是否有序 二分查询 修改集合指定元素的值 快速排序 集合去重 集合复制 集合合并 集合差集 集合补集 集合并集 集合交集 销毁集合 前沿 数组长度是固定的,那么在很多时候我们并不知道到底有多少数据需要存储,这时候我么就需要一个可变长度的数组来进行存储,在C语言中需要我们自己进行定义,我们称为集合

  • C++语言io流处理基本操作教程示例详解

    目录 一.输入输出流对象 流对象常用的处理函数 流控制字符 二.字符流操作 sstream 三. 文件流流类 四.文件指针定位 一.输入输出流对象 cout:标准输出流 cerr:标准出凑  和cout(只是用于如果是错误时要输出的) cin  :   标准输入 流对象常用的处理函数 输出字符 put() 输入字符:get() 输出字符串:write() 输入字符串getline() char ch; cin.get(ch); cout << ch<<endl; cout.put(

  • C++语言io流处理基本操作教程示例

    目录 一.输入输出流对象 流对象常用的处理函数 流控制字符 二.字符流操作 sstream 三. 文件流流类 四.文件指针定位 一.输入输出流对象 cout:标准输出流 cerr:标准出凑  和cout(只是用于如果是错误时要输出的) cin  :   标准输入 流对象常用的处理函数 输出字符 put() 输入字符:get() 输出字符串:write() 输入字符串getline() char ch; cin.get(ch); cout << ch<<endl; cout.put(

  • Golang语言学习拿捏Go反射示例教程

    目录 1. 反射简介 1.1 反射是什么? 1.2 为什么需要反射? 2. reflect包 2.1 基本反射 2.2 反射与指针 2.3 反射与对象 2.4 反射与函数 2.5 反射例子 3. 总结 1. 反射简介 1.1 反射是什么? Go语言提供了一种机制在运行时更新和检查变量的值.调用变量的方法和变量支持的内在操作,但是在编译时并不知道这些变量的具体类型,这种机制被称为反射.反射也可以让我们将类型本身作为第一类的值类型处理. 反射是指在程序运行期对程序本身进行访问和修改的能力,程序在编译

  • C语言指针教程示例详解

    目录 指针 内存 指针类型 指针运算 二级指针 指针数组 指针 指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作.另外,通过指针可以更便捷地操作数组.在一定意义上可以说,指针是 C 语言的精髓. 概念解释就不去搬原定义了,又臭又长不好理解,精炼两点就是: 1.指针是内存中的一个最小单元的编号,也就是地址: 2.平时我们说的指针,通常是指指针变量,用来存储内存地址的变量 也就是说:指针就是地址,口语中指针通常是指针变量 内存 要搞明白指针首先要搞

  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    目录 头插操作 头删操作 小结 头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作. 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没听说过哪个接口可以在数据前面开一片空间吧,那我们思路就只有一个了——挪数据.那应该从第一位开始挪吗?注意,这和 memcpy 函数机制是一样的,并不意味着后面数据一起挪动,也不会彼此独立,而是相互影响,挪动的数据会对后面数据进行覆盖. 那我们的逻辑就应该是从后往前挪,那我们就直接定一个下标,指向这段空间的最后

  • SpringMVC中常用参数校验类注解使用示例教程

    目录 一.环境准备 二.常用的校验注解及示例 三.校验类方法中的普通参数 四.校验类方法中的自定义对象 五.关于@Valid和@Validated的区别联系 六.分组校验 七.自定义校验注解 一.环境准备 在项目中添加以下依赖 gradle org.hibernate:hibernate-validator:5.3.5.Final maven <dependency> <groupId>org.hibernate</groupId> <artifactId>

  • go语言使用Chromedp实现二维码登陆教程示例源码

    目录 1 Chromedp是什么 2 为什么不使用Selenium 3 文章解决了什么需求 4.如何使用chromedp进行二维码登陆 4.1 安装chromedp 4.2 尝试打开网站 4.3 获取二维码(点击过程) 5. 如何将二维码展示在无图形化的终端上 6. 如何保存Cookies实现短时间免登陆 源码点击下载 1 Chromedp是什么 chromedp是一个更快.更简单的Golang库用于调用支持Chrome DevTools协议的浏览器,同时不需要额外的依赖(例如Selenium和

随机推荐