前言
C++是C的超集,也可以说C是C++的子集。按常理说,C++编译器能够编译任何C程序
C是面向过程的语言。C++是面向对象的语言,具有封装、继承、多态三大特性。
C++增加了C不具有的关键字,如private、template、new等。这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。
C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++可以使用空参数列表。
C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。
在C语言中,输入输出是使用语句scanf()和printf()来实现的,而C++中是使用类来实现的。cin,cout,endl对象,他们本身并不是C++语言的组成部分。虽然他们已经是ANSI标准C++中被定义,但是他们不是语言的内在组成部分。在C++中不提供内在的输入输出运算符,这与其他语言是不同的。输入和输出是通过C++类来实现的,cin和cout是这些类的实例,他们是在C++语言的外部实现。
标准C++中的字符串类取代了C标准C函数库头文件中的字符数组处理函数(C中没有字符串类型)。
C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。
C++中的try/catch/throw异常处理机制取代了标准C中的setjmp()和longjmp()函数。
1. 宏与模板
C:宏定义
C++:模板
在C++中用模板来代替C当中的宏定义。模板不同于宏的文字替换,在编译时会得到更全面的编译器检查,便于编写更健全的代码。利用inline
关键字还能获得编译器的充分优化。模板特性在C++11后支持了可变长度的模板参数表,可以用来替代C中的可变长度函数并保证类型安全
2. 指针与引用
C:指针
C++:引用&
C++当中仍然可以使用C风格的指针,但对于变量传递而言,更推荐使用C++的引用特性来实现类似功能。引用指向对象不能为空,可避免一些空地址访问的问题。但指针由于其灵活性,仍然有用武之处。
值得一提的是,C中的NULL
空指针在C++11起有类型安全的替代品nullptr
。引用和指针间可通过*和&
运算符互相转换
3. struct
C++中的struct
和C中的struct
不能混用。
C中的struct
用来描述一种固定的内存组织结构。而C++中的struct
就是一种类,它与类的唯一区别就是它的成员和继承行为默认都是public的,而一般类的默认成员是private
的
另外,声明struct
时C繁琐,C++更简洁
C版本:
typedef struct Node_t{
struct Node_t *next;
int key;
} Node;
C++版本:
struct Node {
Node *next;
int key;
};
4. const
C:const
只有限定变量不能修改的功能
C++:由于大量新特性的出现,const 被赋予的更多用法。被常量修饰符 const
修饰的对象或类型都是只读量,只读量的内存存储与一般变量没有任何区别,但是编译器会在编译期进行冲突检查,避免对只读量的修改。因此合理使用 const
修饰符可以增加代码健壮性。
C++中const用法详解:传送门
5. 内存分配
C:malloc()
、realloc()
、free()
C++:new()
、delete()
C++中新增new()
、delete()
关键字用来在“自由存储区”上分配空间,这个自由存储区可以是堆也可以是静态存储区,他们是为了配合“类”出现的。其中delete()
还能直接释放动态数组的内存,非常方便。new()
、delete()
关键字会调用类型的构造函数和析构函数,相比C中的malloc()
和free()
函数,它们对类型有更完善的支持,但是效率不如C中的这些函数
如果需要动态分配内存的对象是基础类型或它们的数组,可以使用malloc()
进行更高效率的内存分配
如果新建的对象是非基础类型的,建议使用new
以获得安全性检查。尽管new
和malloc
返回的都是指针,但new
出来的指针只能用delete
回收,而malloc
出来的指针只能用free
回收,否则会有内存泄露风险