注:以下内容大部分为从互联网上整理而来,纯粹为了学习。
C++之名是Rick Mascitti在1983年夏天定名的(参见The C++ Programming Language(Special Edition)1.4节),C说明它本质上是从C语言演化而来的,“++”是C语言的自增操作符。C++语言是C语言的超集,是在C语言基础上进行的扩展(引入了new、delete等C语言中没有的操作符,增加了面向对象程序设计的直接支持,等等),是先有C语言,再进行++。根据自增操作符前、后置形式的差别,C++表示对C语言进行扩展之后,还可以使用C语言的内容;而写成++C则表示无法再使用C的原始值了,也就是说C++不能向下兼容C了,这与实际情况不符。
《C++ Primer》源代码网站:http://www.informit.com/title/0321714113
中文版答案详解,比较好的仓库:https://github.com/jieniyimiao/CppPrimer
https://github.com/pezy/CppPrimer 原大神的仓库
C和C++的不同点主要有:
- C是面向过程的语言,而C++是面向对象的语言
- C++ 支持封装、继承、多态
- C++支持函数重载、运算符重载
- C和C++动态管理内存的方法不一样,C是使用malloc/free函数,而C++除此之外还有new/delete关键字。
- C++的类是C所没有的,但是C中的struct是可以在C++中正常使用的,并且C++对struct进行了进一步的扩展,使struct在C++中可以和class一样当做类使用,而唯一和class不同的地方在于struct的成员默认访问修饰符是public,而class默认的是private;
- C++中有引用,而C没有。引用和指针的区别。
- C++特有输入输出流,iostream,cin和cout等。
malloc 和new的区别
- malloc/free是函数;而new/delete是关键字,运算符。malloc/free和new/delete都可用于申请动态内存和释放内存。
- malloc是从堆上开辟空间,而new是从自由存储区开辟;(自由存储区是 C++抽象出来的概念,不仅可以是堆,还可以是静态存储区);
- malloc对开辟的空间大小需要严格指定,而new只需要对象名;
- malloc开辟的空间既可以给单个对象用也可以给数组用,释放的方式都是free();而new开辟对象数组用的是new[size] ,释放的的时候是 delete[]
- 对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
- new 返回指定类型的指针,并且可以自动计算所需要大小; 而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
- malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
有了malloc/free为什么还要new/delete?
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?
这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
引用与指针的区别
- 引用是变量a的别名,而指针是存储变量a的地址。
- 引用必须初始化,不能为空,指针可以。
- 引用初始化后不能更改,指针可以。
- 引用没有const一说,指针有可以被const修饰。具体指没有int& const a这种形式,而const int& a是有的,前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变
- 引用只能是一级的,即&b,不能出现&&b, 指针可以。
- 引用和指针在运算的时候,也是有区别的,例如++操作。
- 引用的好处:引用作为参数传递时,可以直接给实参进行更改。如果使用指针,则必须先定义一个指针类型,指向要传递的参数,然后再作为实参传递,比较麻烦,且浪费内存空间。