前言

  本文略谈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语言面向对象风格编程的更多相关文章

  1. 零基础入门该如何实现C 语言面向对象编程(很有帮助)

    零基础如果更快更好的入门C语言,如何在枯燥的学习中找到属于自己的兴趣,如果把学习当成一种事务性的那以后的学习将会很难有更深入的进步,如果带着乐趣来完成学习那将越学越有意思这样才会让你有想要更深入学习的 ...

  2. R 语言编码风格指南

    R 语言是一门主要用于统计计算和绘图的高级编程语言.这份 R 语言编码风格指南旨在让我们的 R代码更容易阅读.分享和检查.以下规则系与 Google 的 R 用户群体协同设计而成. 概要: R编码风格 ...

  3. 来自 Google 的 R 语言编码风格指南

    来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...

  4. python03 面向对象的编程01

    话不多说,直接进入正文: 编程思想: 我个人所了解的有2种,还有个函数式编程的概念模模糊糊(大概是把常用的代码封装成一个函数,重复调用即可,先认为就是这样吧) 1 面向对象:面向对象是把所有的事务物当 ...

  5. 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?

    面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...

  6. C++面向对象的编程

    C++面向对象的编程 目录 对C++面向对象编程的理解 声明和定义类 声明和定义 构造函数 析构函数 静态成员和静态变量 类实例化对象 对象的浅复制和深复制 继承 单继承 多继承 虚函数 类模板 其他 ...

  7. Objective-C面向对象的编程

    Objective-C面向对象的编程 目录 对面向对象编程思想的理解 类的声明和定义 类的声明和定义 对关键字super和self的理解 初始化函数 @property声明类成员 类的实例化 继承 组 ...

  8. Python 2.7 学习笔记 面向对象的编程

    python是一种面向对象的语言.本文介绍如何用python进行面向对象的编程. 首先我们说下对象和类,类是一种类型的定义,对象是类的实例. 一.内置对象类型(内置类) 其实我们前面已经大量用到了对象 ...

  9. 用面向对象的编程方式实现飞机大战小游戏,java版

    概述 本文将使用java语言以面向对象的编程方式一步一步实现飞机大战这个小游戏 本篇文章仅供参考,如有写的不好的地方或者各位读者哪里没看懂可以在评论区给我留言 或者邮件8274551712@qq.co ...

随机推荐

  1. ubuntu 12.04 64位设置兼容32位的实现

    在ubuntu12.04上,要运行32的程序,需要安装32位的兼容库. 以前在10.04上成功安装过,方法是 sudo apt-get install ia32-libs 但是在12.04上遇到了困难 ...

  2. POJ C程序设计进阶 编程题#3:运算符判定

    编程题#3:运算符判定 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 两个 ...

  3. scribe日志分析工具安装

    系统CentOS6.2 x86_64 1.yum安装gcc,flex,m4,python/python-devel,ruby,libevent/libevent-devel,openssl/opens ...

  4. JS焦点图 上下翻动 支持IE6

    <div class="slider"> <ul class="num" id="homePushName"> &l ...

  5. memcached for windows 修改端口和最大内存

    解压后只要在命令窗口中输入下面命令c:\memcached\memcached.exe -d install  就可以把memcached安装为windows服务了. 启动该服务后,memcached ...

  6. 用,隔开sql临时表

    IF OBJECT_ID('[kkd].[proc_kkd_GetAutoExamineBid]') IS NOT NULL BEGIN DROP PROC [kkd].[proc_kkd_GetAu ...

  7. Maven的HTTP代理设置

    http://blog.sina.com.cn/s/blog_4f925fc30102ed3y.html   第一.检测本地网络是否不能直接访问Maven的远程仓库,命令为ping repo1.mav ...

  8. 选择两个字段时distinct位置的影响

    当选择两个字段时,例如:"select XX1, XX2 from tb; ",那么将distinct放在前一个字段XX1之前和放在后一个字段XX2之前,结果有什么不同呢? 先说结 ...

  9. ubuntu下svn使用指南

    ubuntu下安装subversion客户端: sudo apt-get install subversion subversion-tools 详细请看 http://www.subversion. ...

  10. Qt使用默认浏览器打开网页

    #include <QDesktopServices> #include <QUrl> QDesktopServices::openUrl(QUrl("http:// ...