C语言面向对象风格编程
前言
本文略谈C面向对象风格编程,如何使用过程式语言去模拟面向对象的特性?C面向对象的方式和形式很多,不一而足,本文的代码形式是模拟部分C++面向对象关键词并赋予其特性,这种方式对于初级程序员比较好理解。但是要明确的是,只要使用OO思想编写程序,那么写出的就是面向对象代码,比如Linux C。面向对象语言如C++,Java则是在编译器层面为语言做了那部分工作,所以使用过程式语言则需要通过写代码手动完成那部分工作。
面向对象简述
面向对象具备3大特性:封装、继承和多态。大多数语言都具有封装特性,只不过面向对象在封装上进一步增强,并且将数据和方法进行糅合。在面向对象中顶级存在是类和对象,而在过程式语言中函数则是顶级存在。
上代码和示例
Object.h是所有类需要包含的,Person.h里面有人类示例,ObjectStyleCoding.cpp是C语言面向对象示例。本文旨在抛砖引玉。并未实现继承和多态因为其比较复杂,但其思想是结构指针、查表和判断。
Object.h:
#include<stdlib.h>
#ifdef Cplusplus_H
namespace ObjectStyleCLang{
#else
extern "C"{
#endif #ifndef Object_Header_H
#define Object_Header_H
//boolean define
#define TRUE 1
#define FLASE 0 //class key words define
#define Public
#define Private static
#define ClassStatement(ClassName) struct ClassName
#define Class(ClassName) struct ClassName
#define ClassInnerPointer(ClassName) Class(ClassName)*ObjectThis
//memory define
#define NewArray(type,size) ((type*)malloc(sizeof(type)*size))
#define New(type) NewArray(type,1)
#define Delete(memory) free(memory) void ObjectCopy(unsigned char*,unsigned char*,unsigned int);
void ObjectCopy(unsigned char* dst,unsigned char* src,unsigned int Len)
{
unsigned int i=;
for(;i<Len;i++){
dst[i]=src[i];
}
} void StrCopy(char*dst,const char*src)
{
while (*src)
*dst++=*src++;
} #endif #ifdef Cplusplus_H
}
#else
}
#endif
Person.h:
#include "stdafx.h"
#include "Object.h" #ifdef Cplusplus_H
namespace ObjectStyleCLang{
#else
extern "C"{
#endif #ifndef Person_Header_H
#define Person_Header_H ClassStatement(Person);
Public void Person_constructor(Class(Person)*);
Public void setage(Class(Person)*,int);
Public int getage(Class(Person)*);
Public void setname(Class(Person)*,char*);
Public char* getname(Class(Person)*self); Class(Person){
//Class data
ClassInnerPointer(Person);
//Class data
Public int age;
Public char name[];
//method
Public void (*setAge)(Class(Person)*,int);
Public int (*getAge)(Class(Person)*);
Public void (*setName)(Class(Person)*,char*);
Public char* (*getName)(Class(Person)*);
}; Public void Person_constructor(Class(Person)*self)
{
self->ObjectThis=self;
self->getAge=getage;
self->setAge=setage;
self->getName=getname;
self->setName=setname;
self->age=self->name[]=;
} Public void setage(Class(Person)*self,int age)
{
self->age=age;
}
Public int getage(Class(Person)*self)
{
return self->age;
}
Public void setname(Class(Person)*self,char* str)
{
StrCopy(self->name,str);
}
Public char* getname(Class(Person)*self)
{
unsigned char i=;
char* name = NewArray(char,);
while(self->name[i]){
name[i]=self->name[i];
i++;
}
name[i]='\0';
return name;
} #endif #ifdef Cplusplus_H
}
#else
}
#endif
ObjectStyleCoding.cpp:
// ObjectStyleCoding.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "Person.h"
#include<iostream> int _tmain(int argc, _TCHAR* argv[])
{
Class(Person) fang;
Person_constructor(&fang);//构造函数
fang.setAge(&fang,);
fang.setName(&fang,"fang");
std::cout<<fang.getName(&fang)<<std::endl;
return ;
}
C语言面向对象风格编程的更多相关文章
- 零基础入门该如何实现C 语言面向对象编程(很有帮助)
零基础如果更快更好的入门C语言,如何在枯燥的学习中找到属于自己的兴趣,如果把学习当成一种事务性的那以后的学习将会很难有更深入的进步,如果带着乐趣来完成学习那将越学越有意思这样才会让你有想要更深入学习的 ...
- R 语言编码风格指南
R 语言是一门主要用于统计计算和绘图的高级编程语言.这份 R 语言编码风格指南旨在让我们的 R代码更容易阅读.分享和检查.以下规则系与 Google 的 R 用户群体协同设计而成. 概要: R编码风格 ...
- 来自 Google 的 R 语言编码风格指南
来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...
- python03 面向对象的编程01
话不多说,直接进入正文: 编程思想: 我个人所了解的有2种,还有个函数式编程的概念模模糊糊(大概是把常用的代码封装成一个函数,重复调用即可,先认为就是这样吧) 1 面向对象:面向对象是把所有的事务物当 ...
- 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...
- C++面向对象的编程
C++面向对象的编程 目录 对C++面向对象编程的理解 声明和定义类 声明和定义 构造函数 析构函数 静态成员和静态变量 类实例化对象 对象的浅复制和深复制 继承 单继承 多继承 虚函数 类模板 其他 ...
- Objective-C面向对象的编程
Objective-C面向对象的编程 目录 对面向对象编程思想的理解 类的声明和定义 类的声明和定义 对关键字super和self的理解 初始化函数 @property声明类成员 类的实例化 继承 组 ...
- Python 2.7 学习笔记 面向对象的编程
python是一种面向对象的语言.本文介绍如何用python进行面向对象的编程. 首先我们说下对象和类,类是一种类型的定义,对象是类的实例. 一.内置对象类型(内置类) 其实我们前面已经大量用到了对象 ...
- 用面向对象的编程方式实现飞机大战小游戏,java版
概述 本文将使用java语言以面向对象的编程方式一步一步实现飞机大战这个小游戏 本篇文章仅供参考,如有写的不好的地方或者各位读者哪里没看懂可以在评论区给我留言 或者邮件8274551712@qq.co ...
随机推荐
- Js 访问Aspnet后台页面变量
一.普通WebForm页面 <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server ...
- zabbix2.4 安装配置
首先从www.zabbix.com下载rpm包: 接下来我要配置一台zabbix server,自己监控自己即使服务端又是客户端,zabbix web gui和zabbix数据库都放在同一台主机上,除 ...
- PHP CURL访问HTTPS使用详解
三年前写过一篇<一个简陋的支持HTTPS的PHP CURL封装函数>,当时只是知其然不知其所以然,今天来详细梳理一下. https服务器post数据 代码如下 复制代码 function ...
- c# float和double的“坑”
定义一个float类型的变量=0.7,结果在IL中却是0.69999999. 乘以10之后,获取整数值.得到的却是6.通过查看IL,竟然被转换成double类型再转换.就变成6了. Demo: IL: ...
- desin pattern
uml tool http://cruise.site.uottawa.ca/umple/ http://www.umldesigner.org/download/ http://www.eclips ...
- WPF 中的字号问题
用WPF搞打印机真是各种碰壁,尤其是对于我这个没有搞过打印机的人来说,更是遍布神坑T_T. 今天敲代码的时候发现字体的FontSize貌似跟单位也有关系啊,因为打印的时候效果感觉和预期竟然是有着差距的 ...
- [原创]Postgres-XC集群笔记-概念与环境搭建
文所描述的Postgres-XC版本:v1.2.1项目主页地址:http://sourceforge.net/projects/postgres-xc/ pdf文件下载: Postgres-XC集群搭 ...
- 九度oj 1528 最长回文子串
原题链接:http://ac.jobdu.com/problem.php?pid=1528 小白书上的做法,不过这个还要简单些... #include<algorithm> #includ ...
- libcurl 安装使用一
一.下载libcurl http://curl.haxx.se/download/curl-7.21.1.tar.gz 二.安装 指定了安装目录 /usr/local/curl 命令1: ...
- NPOI导出word,以及对table的一些设置
参考网址:http://www.aiuxian.com/article/p-1970779.html NPOI版本:2.1.3.1 最终效果图: 代码: /// <summary> /// ...