您的位置:首页 > 编程语言 > C语言/C++

C++学习序列之----程序员如何实现从C到C++的转变

2012-04-22 23:05 239 查看
以下是按照先理清楚C和C++之间的关系,其次要区别它们之间的不同,最后提出转向的解决方案。

对于熟悉C的程序员,习惯C++需要一些时间,因为C是C++的子集,在C++中,所有的C技术都可以用,但很多用起来又不适合。例如:C++程序员会认为指针的指针看起来很古怪,因为他们觉得为什么不用指针的引用来代替呢?

在C里面提供了宏、指针、结构、数组和函数,不管什么问题,C都可以用宏、指针、结构、数组和函数来解决,C就好像谭老爷子说的重点在于数据结构和算法。而C++却不是这样,当然,宏、指针、结构、数组和函数在C++里面也支持,但除了这些,C++还提供私有和保护型成员、函数重载、缺省参数、构造和析构函数、自定义操作、内联函数、引用、友元、模板、异常、名字空间,等等,C++考虑更多的是如何构造一个对象模型。因此C++比C具有更宽广的空间,因为设计时会有更多的选择可以考虑。总结一句话:C是C++的子集,C与C++的最大区别在于它们的用于解决问题的思想方法不一样。

下面举几个例子来说明一下C与C++之间的区别:

1、尽量用const和inline而不用#define

在C中,我们经常会发现程序员使用#define定义一个常量或者一个函数,但在C++中,却是经常使用const定义一个变量和inline定义一个函数更多,为什么呢?因为define是一种预处理,而const和inline是编译器来处理的,利用编译器来处理能更容易发现错误和减少错误。

例如我们用预处理定义一个常量和定义一个函数返回两个整形数中的较小值:

a. #define ASPECT 1.623

b. #define MAX(a,b) (a)<(b)?(a):(b)

在C++中,可能更多的程序员会这样写:

c.const double ASPECT = 1.623

d.inline int max(int a, int b){return a>b?b:a;}

对比a、b和c、d,很多时候都能实现相同的功能,可是在一些情况下,它们会有所区别:

第一种情况:假设程序在使用到预处理ASPECT的地方报错,那么在a的情况之下,编译器会认为是1.623出错,而不会认为是ASPECT出错;而在c的情况下,编译器会认为是ASPECT出错,很明显,第一种情况相对来说更难以分析错误,因为1.623只是一个浮点型常量而已。

第二种情况:使用b定义一个函数求最小值,如果调用如下:

max(++a,b);//调用预处理,a已经加了两次

max(++a,b+10);//调用预处理,a加了一次,因为a+1<b+10

而如果调用d顶用的内联函数,则不会发生a加了两次的情况,而这种情况一般、来说才是程序员想要输出的结果。可能有些仔细的人会问:上面两个函数有点不同,d只能处理整形数,而b能处理更多的数据类型,这个问题能用模板来解决:

e. Templete<class T>

inline T& max(T& a, T& b){return a>b?b:a;}

虽然预处理有不好的地方,但是一些地方仍然经常用到它,比如在#ifndef #define #endif中来判断是否某个宏已经定义。

2、内存分配函数malloc、free和new、delete之说。

在C中,我们习惯用malloc和free申请一块内存:

f、string *p=(string*)malloc(10*sizeof(string));//分配10个string大小的内存空间,而p指向整个内存块,但是没有创建string对象,所以程序员没有办法来初始化每个string对象。

然后free(p),释放p所指向申请的内存空间。

在C++中,更多的是使用下面的方法来分配内存空间:

g、string *s=new string[10];//可以创建每个string对象,并且可以随意操作和初始化每个对象。

delete[] s;//先调用析构函数,再释放内存空间

最后,作为一名C程序员,如何实现向C++程序员的转型呢?

1、首先要清楚C++的特性,C++有宏、指针、结构、数组以及私有和保护型成员、函数重载、缺省参数、构造和析构函数、自定义操作、内联函数、引用、友元、模板、异常、名字空间,要习惯C++的风格,遇到问题,在实现的基础上,要思考C++和C实现之间的对比,用C++的类型安全和扩展的特性实现和解决问题。

2、多点阅读C++实现的小代码和项目代码,加深对C++特性的理解。

3、最后,不要被C++强大的功能吓到,哪一个高手不是从一个新手开始的,向高手努力吧!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: