1. 程式人生 > >C語言模擬類的一個實例

C語言模擬類的一個實例

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(const
char* 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語言模擬類的一個實例