C語言模擬類的一個實例
阿新 • • 發佈:2019-02-24
tdi 變量 實的 style ace name 特征 people res
#include <stdio.h> #include <stdlib.h> /*用c語言模擬面向對象操作 修改:張亞雄 C語言中的結構體是後來面向對象編程中的類的啟蒙師傅。 只不過很遺憾,丹尼斯忘記把函數放進結構體裏面了。要不然後來也就沒有java和C#什麽事了。 對象具有屬性和方法,一般用類來來封裝屬性和方法。 C語言是面向過程的編程語言,那麽,它能不能借用面向對象的思路來進行程序設計呢?答案是可以。 這裏嘗試使用結構體和指針來實現這個想法。不過實例一只實現了屬性的封裝。該程序正常運行 實例一 先定義一個結構體 */ struct Person {char* name; int age; int height; int weight; }person,*p; //並沒有使用,思考為什麽? /* 下面是一個造人的函數,可以存儲對象的屬性,但是還沒有方法。返回的是一個結構體指針變量。造人函數有4個參數。 這些參數傳遞給內部的結構體成員進行賦值,這相當於給對象的屬性賦值。 這個結構體變量在函數中被maloco函數配置到了內存的一個區域, maloco函數會返回一個指針給結構體指針變量who。 在函數內部使用這個結構體指針變量who給結構體成員賦值。 然後把這個指針變量返出函數外部。 */ struct Person* Create_person(constchar* name,int age,int height,int weight) { struct Person* who = malloc(sizeof(struct Person)); /*用內存分配函數maloco開辟一塊區域,大小由關鍵字sizeof決定 */ /*該malodo函數會返回一個無類型指針變量*/ /*把malodo函數返回的無類型的指針賦值給結構體指針變量who。賦值的同時會進行強制類型轉換。*/ /*這一個表達式包含了很多知識點,能看懂的童鞋說明有一定的功力*/ who->name=name; //給結構體內部的成員賦值 who->age=age; who->height=height; who->weight=weight; return who; //返回一個指針 } //當調用上面這個函數的時候,通過參數把數據傳遞進去,感覺像是給類的屬性賦值。 //怎麽“殺人”呢? void Destroy_person(struct Person* who) { free(who->name); // be carefull ,只殺一個姓名? free(who); //通過指針釋放這個內存區域 } //輸出“人”的信息的函數: void Print_person(struct Person* who) { printf("Name:%s\n",who->name); printf("Age:%d\n",who->age); printf("height:%d\n",who->height); printf("weight:%d\n",who->weight); } //main.最後測試一下: int main(int argc, char *argv[]) { // make two people structures 造兩個人:joe 和frank。通過參數賦值。 struct Person *joe = Create_person( "Joe Alex", 32, 64, 140); //給joe初始化賦值,數據被保存在一個結構體裏 struct Person *frank = Create_person( "Frank Blank", 20, 72, 180); //可以用這個表達式不斷地造人 printf("c語言模擬面向對象編程\n"); // print them out and where they are in memory printf("Joe is at memory location %p:\n", joe);//打印joe的地址,註意%p符號。 Print_person(joe); //打印joe的數據 printf("**********************************\n"); printf("Frank is at memory location %p:\n", frank); //打印joe的地址,註意%p符號。 Print_person(frank); printf("*修改數據 and print them again*\n"); // make everyone age 20 years and print them again //修改joe的數據 joe->age += 20; joe->height -= 2; joe->weight += 40; Print_person(joe); //再次打印joe的修改過的數據 printf("***再次打印joe的修改過的數據***\n"); frank->age += 20; frank->weight += 20; Print_person(frank); printf("**再次打印frank的修改過的數據******\n"); // destroy them both so we clean up Destroy_person(joe); //殺死joe。真實的含義是釋放內存 Destroy_person(frank); //殺死frank printf("space is free\n"); //可以添加檢查指針是否為空的語句。 return 0; }
| 下面看一下我自己的實現方法:
文件 User.h
void PersonFunction();
文件 User.c
#include "User.h" #include<stdio.h> #include<limits.h> #include <stdlib.h> /* 猜想驗證2:造一個假的類 思考: 類有哪些特征? 1. 有成員變量 2. 有行為 3. 有構造方法 思路: 用C裏面的結構體來做 補充: 研究一下C裏面的不定參函數 */ //結構體聲明 typedef struct { int a; int b; void (*PersonFunctionPointer)(void);//方法指針 }Person; Person* Person_(int a, int b);//相當於構造方法 Person* Person_(int a, int b) {//相當於構造方法 Person* person = (Person*)malloc(sizeof(Person)); person->a = a; person->b = b; person->PersonFunctionPointer = &PersonFunction; return person; } bool freePerson(Person* person) {//對象銷毀的方法 free(person); person = NULL; return person == NULL ? true : false; } void sayHi(Person* person) { printf("Hi I am Person.sayHi()...\n"); printf("a is:%d\n", person->a); printf("b is:%d\n", person->b); } int main() { Person* person = Person_(1, 1); person->a;//相當於成員變量 person->PersonFunctionPointer();//相當於成員方法 printf("free之前這個指針的值是:%p\n", person); freePerson(person); printf("free之後這個指針的值是:%p\n", person); getchar(); return 1; } void PersonFunction() { printf("大家好,我是PersonFunction\n"); }
C語言模擬類的一個實例