📜  oops 中的对象 - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:44:53.825000             🧑  作者: Mango

OOPs中的对象 - C语言

在C语言中,实现面向对象编程需要引入结构体和指针等概念。因此虽然C语言并不是面向对象编程语言,但通过一些技巧,也可以实现面向对象编程。

C语言中的结构体

在C语言中,我们可以使用结构体来组织相关的数据,与面向对象编程中的类相对应。

#include <stdio.h>

struct student {
    char name[20];
    int age;
};

int main() {
    struct student s1 = {"Tom", 18};
    printf("Name: %s\n", s1.name);
    printf("Age: %d\n", s1.age);
    return 0;
}

上面的代码中,我们定义了一个student结构体,包含一个名字和一个年龄。在main函数中,我们创建了一个命名为s1student结构体,然后输出它的名字和年龄。

结构体和指针

在C语言中,访问结构体中的成员需要使用点操作符'.'。另外,我们还可以使用指针来访问结构体中的成员。使用指针访问结构体成员,需要使用箭头操作符'->'

#include <stdio.h>

struct student {
    char name[20];
    int age;
};

int main() {
    struct student s1 = {"Tom", 18};
    struct student *p = &s1; // 创建指向s1结构体的指针
    printf("Name: %s\n", p->name); // 使用箭头操作符访问结构体中的成员
    printf("Age: %d\n", p->age);
    return 0;
}
C语言中的面向对象编程

通过结构体和指针,我们可以在C语言中实现一些面向对象编程的概念,例如封装、继承和多态。

封装

在C语言中,我们可以使用结构体和函数来实现封装,可以将结构体和函数放在同一个文件中,然后在其他文件中调用这些函数。

// student.h
struct student {
    char name[20];
    int age;
};
void set_name(struct student *s, char *name); // 设置名字
char *get_name(struct student *s);            // 获取名字
void set_age(struct student *s, int age);     // 设置年龄
int get_age(struct student *s);               // 获取年龄

// student.c
#include <stdio.h>
#include "student.h"

void set_name(struct student *s, char *name) {
    strcpy(s->name, name);
}

char *get_name(struct student *s) {
    return s->name;
}

void set_age(struct student *s, int age) {
    s->age = age;
}

int get_age(struct student *s) {
    return s->age;
}

// main.c
#include <stdio.h>
#include "student.h"

int main() {
    struct student s1;
    set_name(&s1, "Tom");
    set_age(&s1, 18);
    printf("Name: %s\n", get_name(&s1));
    printf("Age: %d\n", get_age(&s1));
    return 0;
}

上面的代码中,我们将student结构体和处理这个结构体的函数放在了student.h头文件和student.c文件中。在main.c文件中,我们通过调用这些函数来操作s1结构体对象。

继承

在C语言中,我们可以使用结构体嵌套来实现继承的概念。

#include <stdio.h>

struct person {
    char name[20];
    int age;
};

struct student {
    struct person p; // 嵌套person结构体
    int score;
};

int main() {
    struct student s1 = {{"Tom", 18}, 90};
    printf("Name: %s\n", s1.p.name);
    printf("Age: %d\n", s1.p.age);
    printf("Score: %d\n", s1.score);
    return 0;
}

上面的代码中,我们定义了一个person结构体和一个student结构体,student结构体中包含了person结构体。这样,我们就可以在student结构体中存储person结构体中定义的数据。

多态

在C语言中,我们可以使用函数指针来实现多态。下面是一个例子:

#include <stdio.h>

struct animal {
    void (*sound)(void);
};

void dog_sound() {
    printf("Wang Wang!\n");
}

void cat_sound() {
    printf("Miao Miao!\n");
}

int main() {
    struct animal a1 = {dog_sound};
    struct animal a2 = {cat_sound};
    a1.sound();
    a2.sound();
    return 0;
}

上面的代码中,我们定义了一个animal结构体,它包含一个指向函数的指针sound。然后我们定义了两个函数dog_soundcat_sound,这两个函数都没有参数和返回值。最后,在main函数中,我们创建了两个animal对象,并将sound指针分别指向dog_soundcat_sound函数。这样,我们就可以通过a1.sound()a2.sound()来调用不同的函数,实现多态的效果。

总结

虽然C语言并不是面向对象编程语言,但我们可以通过结构体和指针等技巧来实现面向对象编程的概念。在实现封装、继承和多态等概念时,需要灵活使用结构体和函数指针等工具。