C语言(面向过程)已经这么强大,甚至于Linux都是由C语言编写的,我们为什么还要引入C++(面向对象)?

假设有这样一个需求:

写一个程序,输出张三、李四两个人的姓名、年龄

C语言实现

首先尝试用C语言实现,定义一个person结构体,在结构体中定义两个成员分别表示姓名和年龄。

#include <stdio.h>

#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))

typedef struct person {
    char *name;
    int age;
} person;

int main(int argc, char **argv)
{
    int i;
    person persons[] = {
        {
            "zhangsan", 10,
        },
        {
            "lisi", 16
        }
    };

    for (i = 0; i < ARRAY_SIZE(persons); i++) {
        printf("name = %s, age = %d\n", persons[i].name, persons[i].age);
    }

    return 0;
}

代码可以进一步修改,使用一个函数(printfInfo函数)来打印人物的信息,在原有的结构体中增加一个函数指针(printfInfo函数指针)。

C语言中,是不允许函数名和变量名相同的,但是这里的printfInfo函数指针,其实是person结构体中的一个成员名称,而不是变量名。所以这两者相同,是符合语法规范的。

#include <stdio.h>

#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))

typedef struct person {
    char *name;
    int age;

    void (*printfInfo)(struct person *per);
} person;

void printfInfo(struct person *per)
{
    printf("name = %s, age = %d\n", per->name, per->age);
}

int main(int argc, char **argv)
{
    int i;
    person persons[] = {
        {
            "zhangsan", 10, printfInfo,
        },
        {
            "lisi", 16, printfInfo,
        }
    };

    for (i = 0; i < ARRAY_SIZE(persons); i++) {
        persons[i].printfInfo(&persons[i]);
    }

    return 0;
}

将函数指针从结构体成员中移除出去,单独创建一个函数用于打印成员信息,感觉会更合适一点,如果不同成员需要打印的信息不同,也可以在这个打印函数中做适配。

C++实现

使用C++来实现,既然打印函数都相同,那不如直接在结构体中定义打印函数,后续就不要再单独定义。

#include <stdio.h>

#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))

typedef struct person {
    char *name;
    int age;

    void printfInfo() {
        printf("name = %s, age = %d\n", name, age);
    }
} person;

int main(int argc, char **argv)
{
    int i;
    person persons[] = {
        {
            "zhangsan", 10,
        },
        {
            "lisi", 16,
        }
    };

    for (i = 0; i < ARRAY_SIZE(persons); i++) {
        persons[i].printfInfo();
    }

    return 0;
}

C++中的结构体,在C语言的基础上做了两个扩展:

  1. 可以直接在结构体中定义函数;
  2. 结构体中定义的函数,可以直接访问这个结构体中的其他成员;

但是,C++中一般不使用结构体,而是使用类。

C++中,类和结构体有一个重要区别就是,类的成员默认是私有的,而结构体的成员,默认则是公有的

用类替换结构体后的代码如下,方便起见,将类的成员都设置为了公有:

#include <stdio.h>

#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))

class person {
//方便起见,类的成员都设置为了public
public:
    char *name;
    int age;

    void printfInfo() {
        printf("name = %s, age = %d\n", name, age);
    }
};

int main(int argc, char **argv)
{
    int i;
    person persons[] = {
        {
            "zhangsan", 10,
        },
        {
            "lisi", 16,
        }
    };

    for (i = 0; i < ARRAY_SIZE(persons); i++) {
        persons[i].printfInfo();
    }

    return 0;
}

总结

其实个人感觉,C语言和C++在使用上都很方便,平时并没有感觉有什么地方必须要使用C而不能使用C++。

这次学习C++主要是因为RTE API是通过C++实现的,并且项目中C++和C语言常常是混杂着用。希望通过后续的学习,可以更多更深入的了解C++。

记录一下,面向对象编程的三大特点:

  1. 封装;
  2. 继承;
  3. 多态;
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐