前言

  本文略谈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. 【自己动手】sublime text插件开发

    今天是五四青年节,在此先祝大家节日快乐!!! --------------------------------------------华丽的分界线--------------------------- ...

  2. php根据身份证号码计算年龄

    代码如下 复制代码 <?php function getAgeByID($id){         //过了这年的生日才算多了1周岁         if(empty($id)) return ...

  3. Java实现计算20的阶乘

    循环从1乘到20,要注意的就是结果可能会很大,长度超出int类型的范围,所以定义乘积的时候用long. 代码如下: public class Practice3 { public static voi ...

  4. VPS centos 6 安装图形界面

    在某种场合之下,我们使用的Linux还是要选择安装桌面环境的,所以在这里介绍一下如何给没有安装桌面环境的系统安装桌面环境.以Centos 6.5 为例演示一下如何安装桌面环境. 工具/原料 Linux ...

  5. 安装Spark集群(在CentOS上)

    环境:CentOS 6.4, Hadoop 1.1.2, JDK 1.7, Spark 0.7.2, Scala 2.9.3 1. 安装 JDK 1.7 yum search openjdk-deve ...

  6. 【推介】TMS的控件之“TMS Unicode Component Pack”和“TMS Advanced Toolbars & Menus”

    TMS Unicode Component Pack是一款支持多语言的界面控件包,提供超过60种控件来为你的Delphi和C++Builder应用程序添加Unicode支持. 介绍: TMS Unic ...

  7. MongoDB探索之路(一)——入门

    1.MongoDB和传统关系型数据库的比较  2.面向文档的 NoSQL 数据库主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能.  3.MongoDB可以作为日志分 ...

  8. c++ 类与函数中static变量初始化问题(转)

    首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数: void Foo() { ; // initialize std::cout << a; a++; } 里的 ...

  9. 在Linux 5/6上使用UDEV SCSI规则配置ASM DISK

    格式化磁盘(略) 识别磁盘(/sbin/scsi_id)  Oracle Linux 5用如下脚本: #!/bin/sh for i in b c d e f g do echo "KERN ...

  10. Python之路-(三级菜单)

    data = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, 'youk ...