前言ios
本文略談C面向對象風格編程,如何使用過程式語言去模擬面向對象的特性?C面向對象的方式和形式不少,不一而足,本文的代碼形式是模擬部分C++面向對象關鍵詞並賦予其特性,這種方式對於初級程序員比較好理解。可是要明確的是,只要使用OO思想編寫程序,那麼寫出的就是面向對象代碼,好比Linux C。面嚮對象語言如C++,Java則是在編譯器層面爲語言作了那部分工做,因此使用過程式語言則須要經過寫代碼手動完成那部分工做。c++
面向對象簡述程序員
面向對象具有3大特性:封裝、繼承和多態。大多數語言都具備封裝特性,只不過面向對象在封裝上進一步加強,而且將數據和方法進行糅合。在面向對象中頂級存在是類和對象,而在過程式語言中函數則是頂級存在。編程
上代碼和示例函數
Object.h是全部類須要包含的,Person.h裏面有人類示例,ObjectStyleCoding.cpp是C語言面向對象示例。本文旨在拋磚引玉。並未實現繼承和多態由於其比較複雜,但其思想是結構指針、查表和判斷。spa
Object.h:指針
1 #include<stdlib.h> 2 #ifdef Cplusplus_H 3 namespace ObjectStyleCLang{ 4 #else 5 extern "C"{ 6 #endif 7 8 #ifndef Object_Header_H 9 #define Object_Header_H 10 //boolean define 11 #define TRUE 1 12 #define FLASE 0 13 14 //class key words define 15 #define Public 16 #define Private static 17 #define ClassStatement(ClassName) struct ClassName 18 #define Class(ClassName) struct ClassName 19 #define ClassInnerPointer(ClassName) Class(ClassName)*ObjectThis 20 //memory define 21 #define NewArray(type,size) ((type*)malloc(sizeof(type)*size)) 22 #define New(type) NewArray(type,1) 23 #define Delete(memory) free(memory) 24 25 void ObjectCopy(unsigned char*,unsigned char*,unsigned int); 26 void ObjectCopy(unsigned char* dst,unsigned char* src,unsigned int Len) 27 { 28 unsigned int i=0; 29 for(;i<Len;i++){ 30 dst[i]=src[i]; 31 } 32 } 33 34 void StrCopy(char*dst,const char*src) 35 { 36 while (*src) 37 *dst++=*src++; 38 } 39 40 #endif 41 42 #ifdef Cplusplus_H 43 } 44 #else 45 } 46 #endif
Person.h:code
1 #include "stdafx.h" 2 #include "Object.h" 3 4 #ifdef Cplusplus_H 5 namespace ObjectStyleCLang{ 6 #else 7 extern "C"{ 8 #endif 9 10 #ifndef Person_Header_H 11 #define Person_Header_H 12 13 14 ClassStatement(Person); 15 Public void Person_constructor(Class(Person)*); 16 Public void setage(Class(Person)*,int); 17 Public int getage(Class(Person)*); 18 Public void setname(Class(Person)*,char*); 19 Public char* getname(Class(Person)*self); 20 21 Class(Person){ 22 //Class data 23 ClassInnerPointer(Person); 24 //Class data 25 Public int age; 26 Public char name[255]; 27 //method 28 Public void (*setAge)(Class(Person)*,int); 29 Public int (*getAge)(Class(Person)*); 30 Public void (*setName)(Class(Person)*,char*); 31 Public char* (*getName)(Class(Person)*); 32 }; 33 34 35 Public void Person_constructor(Class(Person)*self) 36 { 37 self->ObjectThis=self; 38 self->getAge=getage; 39 self->setAge=setage; 40 self->getName=getname; 41 self->setName=setname; 42 self->age=self->name[0]=0; 43 } 44 45 Public void setage(Class(Person)*self,int age) 46 { 47 self->age=age; 48 } 49 Public int getage(Class(Person)*self) 50 { 51 return self->age; 52 } 53 Public void setname(Class(Person)*self,char* str) 54 { 55 StrCopy(self->name,str); 56 } 57 Public char* getname(Class(Person)*self) 58 { 59 unsigned char i=0; 60 char* name = NewArray(char,255); 61 while(self->name[i]){ 62 name[i]=self->name[i]; 63 i++; 64 } 65 name[i]='\0'; 66 return name; 67 } 68 69 #endif 70 71 #ifdef Cplusplus_H 72 } 73 #else 74 } 75 #endif
ObjectStyleCoding.cpp:對象
1 // ObjectStyleCoding.cpp : 定義控制檯應用程序的入口點。 2 // 3 4 #include "stdafx.h" 5 #include "Person.h" 6 #include<iostream> 7 8 int _tmain(int argc, _TCHAR* argv[]) 9 { 10 Class(Person) fang; 11 Person_constructor(&fang);//構造函數 12 fang.setAge(&fang,12); 13 fang.setName(&fang,"fang"); 14 std::cout<<fang.getName(&fang)<<std::endl; 15 return 0; 16 }