C++语言是在C语言的基上添加了面向对象、模板等现代程序设计语言的特性而发展起来的。两者非常相似,在对硬件资源的操作上,C语言更加直接,它的重点在于算法和数据结构,如强大的linux底层设备驱动使用的就是C语言。而C++则更倾向于设计程序,它首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的实际问题,这样就可以通过获取对象的状态信息得到输出或实现对过程或事务的控制。C语言是面向过程语言,而C++则是面向对象的语言,下面我们还是通过一个简单C和C++的程序来说明一下何谓“对象”,以及它的好处。
首先我们写一段这样的代码:
代码中我们需要打印出一个人的名字,年龄,以及它的工作内容,使用C语言来编写的话我们需要用一个结构体来封装“人”这个对象所带有的属性,包括他自己对个人的介绍,C语言的代码如下,代码中我做了详细的备注来进行说明:
#include <stdio.h>
/* "人"这个结构体的声明 */
struct person{
char *name;
int age;
char *work;
/* 在C语言里面我们只能写函数指针,不能直接在内部实现函数内容,该函数用于自我介绍使用 */
void (*printInfo)(struct person *per);
};
/* 定义一个函数用于赋给结构体内部函数指针,相当于去实体化函数指针 */
void printInfo(struct person *per)
{
printf("name = %s, age = %d, work = %s\n", per->name, per->age, per->work);
}
int main(int argc, char **argv)
{
/* 定义两个"人",对人进行编辑 */
struct person persons[] = {
{"zhangsan", 25, "teacher", printInfo},
{"lisi", 30, "doctor", printInfo},
};
/* 调用结构体数组里面各自的函数指针实现个人自我介绍 */
persons[0].printInfo(&persons[0]);
persons[1].printInfo(&persons[1]);
return 0;
}
这个程序实现功能上是完全没有任何问题的,但是有些地方特别别扭,又显示麻烦,像我们的结构体内部定义了一个函数指针,却不能直接实现功能要跑到外面去实体化函数指针,再者后面的“自我介绍”那个函数指针的调用“persons[0].printInfo(&persons[0]);”这句前面明明说明了是persons[0],但是后面你想自我介绍的时候你又要获取多一次persons[0]的地址,这样程序看起来感觉有点多余和冗余,但是没办法,这就是C语言。因此,我们能否改进呢?答案是当然可以,使用C++,具体实现我们先看代码,如下:
#include <stdio.h>
struct person{
char *name;
int age;
char *work;
/* C++的优势体现,我们可以直接在这里实体化函数内容,这里称为实体化方法 */
void printInfo(void)
{
printf("name = %s, age = %d, work = %s\n", name, age, work);
}
};
int main(int argc, char **argv)
{
struct person persons[] = {
{"zhangsan", 10, "teacher"},
{"lisi", 16, "doctor"},
};
persons[0].printInfo();
persons[1].printInfo();
return 0;
}
从下面这段CPP的代码我们可以明显看出来比前面那段C的代码要简短明了很多,这就是C++程序的好处,他可以让代码和对象更加紧凑,直接在结构体内核实体化对象,使人这个对象的描述能力更加强,至此我们可以说这是一个面向“对象”的语言。当然,C++语言有专门描述对象的语法结构叫“类”,我们可以修改上面结构体的代码为类的方式,在C++里面也普遍使用类定义的方式,如下:
#include <stdio.h>
/* 类声明 */
class Person{
/* 这里需要定义为public,否则默认为private不允许外部访问内部的数据成员 */
public:
char *name;
int age;
char *work;
/* C++的优势体现,我们可以直接在这里实体化函数内容,这里称为实体化方法 */
void printInfo(void)
{
printf("name = %s, age = %d, work = %s\n", name, age, work);
}
};
int main(int argc, char **argv)
{
Person persons[] = {
{"zhangsan", 10, "teacher"},
{"lisi", 16, "doctor"},
};
persons[0].printInfo();
persons[1].printInfo();
return 0;
}