C与C++区别
参考:https://blog.csdn.net/u012485480/article/details/79592072
https://blog.csdn.net/u010120125/article/details/78261480
C语言面向过程,重点在于算法和数据结构。C程序的设计首先考虑的是如 何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。
当软件变得越来越复杂,代码越来越长,一个人的脑力有限,往往写到后面,就忘了前面是如何做的。而且复杂的软件需要很多人协同一起完成,这时面向过程的方法就不太实用。因此一种面向对象的软件开发方法应运而生。(为什么产生C++)
C++语言是面向对象语言,首先考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。它在C的基础上添加了面向对象、模板等现在程序设计语言的特性。拓展了面向对象设计的内容,如类、继承、虚函数、模板和容器类等等,使之更加符合现代程序设计的需要。
因为C++并不是所有场合都适用,很多嵌入式开发系统,都只提供了C语言的开发环境,而没有提供C++的开发环境。很多C++语言不愿意干的脏活累活,C语言干起来快活得很。例如某些对性能要求极高的大型系统,诸如搜索引擎算法、银行金融系统等等,只有勤快的C语言能够出色地完成这些任务,而C++因为过于复杂,在这方面就稍逊一筹了。(C++不能完全替代C的原因)
随着当今世界嵌入式开发的发展、大型算法应用,特别是搜索引擎、云计算的兴起,C语言的用武之地不但没有萎缩,反而有逐渐扩展的趋势。(C的应用场景)
C++则非常适合写一些基础架构级软件的,比如编译器,GUI库等等。(C++的应用场景)
C++与Java的区别
1、解释对编译:Java是一种解释性语言,意味着其在执行时会被“翻译”为二进制形式,也就是java跑得时候必须有人(jvm)去解释它(现在的Java语言,其执行方式已经不仅仅是解释执行方式了,即时编译器(JITC、just-in-time compiler)技术和原型编译技术的出现大大提高了JAVA的运行效率),jvm可以安装到任何系统。。而C++则是编译语言,意味着程序只能在特定操作系统上编译并在特定系统上运行,也就是说C++一步到位成机器语言的。
2、内存安全:Java是一种内存安全型语言,意味着大家可以为给定数组分配任意参数,即使超出范围也只会返回错误提示。C++更为灵活,但代价是一旦分配的参数超出资源范围,则会引起错误甚至严重崩溃。
3、性能:Java人气极高,但其代码由于需要在运行前进行解释因此性能表现更差。C++会被编译为二进制形式,因此其能够立即运行且速度更快。如果你写一个c++的程序和做同样事情的java程序,可能你感觉两者速度差不多。但如果这两个程序都足够大、而且c++的代码经过优化,两者的速度差就会变得很显著甚至很惊人,C++会比java快很多。
4、指针:指针是一种C++结构,允许您直接在内存空间中进行值管理。Java不支持指针,因此您可能使用值引用的方式进行值传递。
应用场景:
java侧重于大型企业级应用开发,C++侧重于底层应用开发。Java是Android开发领域的王者,因此移动开发者无疑应该选择它作为项目基础。另外,Java也常见于Web及桌面应用乃至服务器端应用。
C++更接近机器语言,因此其软件运行速度更快且能够直接与计算机内存、磁盘、CPU或者其它设备进行协作。另外,C++也能为游戏提供良好的运行性能。
Java、C与C++的对比
尽管Java是基于C++的的,但是相比之下,Java是一种更纯粹的面向对象程序设计语言。在Java中,一切都被视为对象。
- 内存释放
1)C++创建对象之后,需要再使用完将其调用delete方法将其销毁(手动释放内存空间);
2)Java有垃圾回收机制,用来监视new出来的所有对象,辨别不会再被引用的对象,然后释放内存空间(自动释放内存)。
- 作用域(C、C++、Java的作用域由花括号的位置决定)
以下代码在C和C++中是合法的,在Java中编译器会报告变量已定义。因为C和C++会将较大作用域的变量隐藏起来,但是Java不允许。
{
int x = 12;
{
int x = 9;
}
}
- 基本成员的默认值 (Java)
当变量作为类的成员使用时,Java才确保给定默认值,以确保那些基本类型的成员变量得到初始化,但是C++没有此功能;而对于局部变量,C++编译器会对其予以警告,Java则会视为错误。
- 布尔值的表示(C++)
Java不可以将一个非布尔值当做布尔值在逻辑表达式中使用,C++却可以。 在C++中表达式的值为0则为假,非0则为真。
- 移位操作符 (Java)
Java中新增了一种“无符号”右移位操作符(>>>),它使用“零扩展”,无论正负,都在高位插入0。这是C、C++中所没有的。
- 重载机制(C++)
C++引入了操作符重载机制,Java不支持,但是C#中可以实现自己的重载操作符。
- 数据类型的转换(Java)
Java允许我们把任何基本数据类型转换成别的基本数据类型,除了布尔类型外。
- Sizeof(C++)
Java没有Sizeof()。在C\C++中,sizeof()操作符可以告诉我们为数据项分配的字节数,因为C++中不同的数据类型在不同的机器上可能有不同的大小。但是Java中所有数据类型在所有机器中大小都是相同的。(例如,C++的int在16位机器上为16位,在32及以上为32位,long在32位及以下为32位,在64位上为64位)
- goto(C++)
C++有goto,Java没有goto。(Java提供了一种类似的跳转机制:标签。用法 label:)
- 析构函数(C++)
C++中析构函数是提供一个在对象删除前可以释放这个对象所占用的资源的机会,但是Java并未提供“析构函数”或者类似的概念。
在C++中,对象一定会被销毁(程序没有缺陷的情况下);
在Java里,对象却并非总是被垃圾回收。(垃圾回收并不等于“析构”)
- 名称屏蔽 (C++)
如果Java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本。而C++若要在子类中引入一个新的重载方法,则需要屏蔽基类方法。
- 多继承(C++)
C++中有多继承,Java中只有单一继承。Java可以通过接口实现多继承。
- 运行速度(C++)
Java是半解释和半编译的,运行速度比C++慢。
- Java没有Struct或者Union
- Java的泛型不允许使用基本数据类型。
- 数组
(1)在c++中,数组定义时,已经分配存储空间,并可以使用。 (定义时指定数组大小)
(2)在java中,数组定义时,int arr[],只字义了数组变量,数组是不可以使用的。 只有数组new以后,才会创建数组,分配存储空间,并可以使用。 (定义时指定数组大小是非法的,创建时指定数组大小)
17. 指针(C++)
C++有指针,Java没有。