当初学习编程语言时,学的第一门语言是C++,然后学的是Java,汇编,最后才自学了C语言。这个顺序看起来确实是有点奇怪。自学C语言是因为实用单片机的需要。当初开始用C语言的时候,感觉极其不习惯,因为没有函数重载,没有面向对象的特性,大量的使用宏 等等。再加上keil5那简陋的界面、奇怪的缩进以及只比记事本强一些的语法高亮,体验挺糟糕。当然随着学习的深入,也觉得C语言确实有短小精悍的特点。
接下来,就总结一下C语言以及C++的区别,可能一开始有遗漏或者不足,后一会慢慢更新的。本篇文章重点在于总结C语言过渡到C++需要注意的区别,不涉及 面向对象 模板 STL 等。
头文件与命名空间
C语言没有命名空间的概念,而C++有,最典型的是初学时经常用到的using namespace std; 代表使用命名空间std,或者使用std::functuion(); ,即函数、变量名前面加上空间名和域解析符来使用命名空间。命名空间可以嵌套定义。
为了统一,C++会把C语言的stdio.h math.h string.h 等xxx.h格式的标准头文件用 cstdio cmath cstring 等cxxx格式的C++头文件来替代,从而保留了C语言的标准库函数。
输入输出
C语言常用的是scanf printf 的函数,C++用的是cin cout 对象。C语言的方式更快而且格式控制更方便,而C++的方式能够自动识别了输入输出的类型,自动转换成合适的字符串。
bool 类型
C++用于判断真与假的类型,其大小并没有被规定。C++还有true false 关键字。
当然C语言也可以通过各种方式来定义和使用true和false,但不像C++那样作为关键字,没有C++来的可靠。比如 if(func() == true)就是危险的行为。
string 类型
C++语言处理字符串的类,相比于时刻需要注意越界和’\0’的字符数组,显然更好用。由于构造函数的存在,char *类型的变量很容易构造出string类型。
当需要使用字符数组时,string类型也有相应的c_str函数。 不过注意函数返回的是临时的常指针,如果需要对其修改,需要用strcpy()等函数复制出副本,再对副本操作。
const
C语言中的const代表该变量初始化之后,只能读不能改。但是并不代表每次取值都是一样的,因为还可以通过其他方式修改变量。就像只读方式打开文件一样,你不能对他修改,但是如果这个文件可以被其他人修改,你就不能保证每次读到的内容是一样的。
C++对const的处理更加复杂,假如你用const定义了一个常量var,那么它会被认为是一个常量,哪怕对应地址的内容被强行修改了,访问var时仍然得到的是修改前的内容。
变量定义位置
C语言中的C89标准规定,在代码块里执行语句不能出现在变量定义语句之前。但是C++没有这个限制,只要变量被使用时已经被声明或定义即可。
动态内存管理
C语言只能用malloc等函数开辟一块堆内存,其大小需要计算,返回的指针需要类型转换,内容需要手动去初始化。
而C++申请堆内存的时候可以调用构造函数,释放时能使用析构函数,更方便更安全。
类型转换
C语言可以用小括号进行类型转换。最常见的是malloc函数返回指针的类型转换。
C++的类型转换更加清晰严格,有四种 const_cast static_cast dynamic_cast reinterpret_cast
而且对于类来说,可以自定义类型转换的函数。
默认参数与函数重载
C语言不支持默认函数和函数重载,需要定义更多的函数名。
C++支持默认参数和函数重载,可以大大减少工作量。
指针与引用
C++中,引用的指向不能改变,所以很多情况下C++引用能够代替指针。
空指针
C语言有NULL宏,用于标记空指针
C++有nullptr关键字。c++不允许直接将void*隐式的转化为其他类型,nullptr的类型为nullptr_t,能够隐式的转换为任何指针,所以用空指针就尽可能的使用nullptr。
智能指针
C++不同标准下定义了许多智能指针,用于自动回收不需要的动态内存,这一点比C语言中的指针方便。