学了C++,遗忘了C

来源:互联网 发布:会计使用的软件 编辑:程序博客网 时间:2024/04/29 13:53

 

很多C++程序员,应该说是绝大多数,都学过C语言。也都知道,C++是完全兼容C的。在C++C都作为面向过程开发语言时,这个兼容是有两层含义的:

第一,C中的代码复制到cpp文件里,理论上应当可以通过(实际上这一点不能完全做到)。

第二,C++代码,代码在C文件里是不一定允许编译的。

第二点是会慢慢被C++程序员所遗忘的,至少我是应当感到惭愧的其中之一。

下面一一列举一些,面向过程中易忽略的点(待续):

1、          C语言中不存在引用

请不要讲C++中引用的概念,想当然的带到C中,在C语言里没有引用这一说。符号“&”,作为操作符可以用它进行取地址操作,作为运算符它是位与运算符。

intf(int &para)

{

    returnpara;

}

以上这个函数声明在C中是绝对不合法的,要达到直接操作实参的效果,只能通过指针型参数来实现。实际上,C++中引用的出现完全是为了代码的直观已读,没有增加什么新的特性,因为凡是用引用的能实现的功能我们用指针都可以的。

 

2、           强制类型转换操作符“()

#include<stdio.h>

intmain()

{

  inta=1;

  printf("%c/n",char(a));

  return 0;

}

C中,以上这段代码是编译不通过的,C++程序员找这个错误是有点难的,大家可以想一想错在哪儿了,呵呵。

 

3、           C语言中没有函数模板,这个错在误编译时,会集中地暴露在classtypename这两个关键字上。

4、           C++中声明函数形参默认值的方式不能带到C中来

 

其实,早在C语言中,函数已经具有了多态特性,我们最常用的一个例子就是printf()函数。它的参数列表是可变的,但是这不是用简单的形参默认值实现的,它有专门的稍微复杂的方法实现。

 

5、           C语言中的前置自增和前置自减运算符不可做左值(栽过跟头)

 

inta=0;

++a=2;

这两行代码在cpp文件中编译时,是合法的,得到结果a=2。但是在C文件中会产生一个编译时错误,原因就在于C中的前置自增的结果不是左值的。

 

6、           全局变量的初始化问题

C中全局变量的声明时初始化等号右边只能常量表达式,即不含有函数的表达式。但是,在C++中这是可以的,而且可以正确编译和运行。

#include<stdio.h>

intf(inta)

{

    returna;

}

intpara=f(2);

intmain()

{

printf("%d/n",para);

    return 0;

}

这段代码在cpp文件中是可以运行的,但是在C文件中将产生编译时错误:初始值设定不是常量。

 

7、           局部变量的声明位置问题
  这个错误太要命!!!

C语言中函数中局部变量的声明,必须在整个函数块域的前面完成。但是,在C++中我们可以随用随声明。

 

voidf()

{

    inta=0;

    printf("");

    intb=1;

}

   这个函数在C文件中,编译时会产生一个错误:缺少;在类型前面。


8、           C语言中没有bool类型

     在C中几乎所有表达式都可以作为判断语句的条件,如果一定要设置开关变量的时候,基本上使用int类型代替bool。


9、         C语言中没有内联函数(无inline关键字)

     要实现函数内敛的效果,C中一律通过宏实现,一般为带参数的宏。


10、       C语言中的函数,后面不能加const关键字

     这不是危言耸听,这么用的真有其人,例子一个


11、        C语言不对函数指针的参数列表进行编译时类型检查

                下面的代码在C中是连警告都没有的,在C++中报错2个。          

int func(char *a, int b){    return b;}typedef int (*T_Function)();int main(){    T_Function f = func;    f("", 100);    return 0;}