一直学习C++和C#,两者之间的区别总结一下
目录
一、两种语言概述
C++语言
由美国A T&T公司贝尔实验室的本贾尼·斯特劳斯特卢普于 1979年在C语言基础上进行改进设计,并于1983年被更名为C++ 。C++不是由某个商业化企业进行维护升级,而是由标准化委员会制定执行标准,目的为了统一不同硬件厂商之间编译差异问题。C ++目前执行标准被支持最广泛的是C ++11标准(2011 年8月12日发布)。
C++是一种面向对象的计算机程序设计语言,作为C语言的继承,C++不仅能进行C语言的过程化程序设计,而且可进行以抽象数据类型为特点的基于对象的程序设计,还能进行基于过程的程序设计。C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它的设计风格支持数据抽象、面向对象程序设计、过程化程序设计、泛型程序设计等。
C++语言的程序因为要体现高性能,所以都是编译型的。但其开发环境,为了方便测试,将调试环境做成解释型的。即开发过程中,以解释型的逐条语句执行方式来进行调试,以编译型的脱离开发环境而启动运行的方式来生成程序最终的执行代码。
生成程序是指将源码(C++语句)转换成一个可以运行的应用程序的过程。如果程序的编写是正确的,那么通常只需按一个功能键,即可搞定这个过程。该过程实际上分成两个步骤。
第一步是对程序进行编译,这需要用到编译器。编译器将C++语句转换成机器码;如果这个步骤成功,下一步就是对程序进行链接,这需要用到链接器。链接器将编译获得机器码与C++库中的代码进行合并。C++库包含了执行某些常见任务的函数(“函数”是子程序的另一种称呼)。例如,一个C++库中包含标准的平方根函数sqrt,所以不必亲自计算平方根。C++库中还包含一些子程序,它们把数据发送到显示器,并知道如何读写硬盘上的数据文件。
C#语言
微软公司在2000年6月发布的一款计算机编程语言,具有高效的跨平台特性,由C和C++衍生而来。由微软保证其准确性和唯一性。
C# 语法高度凝练,学习起来也很简单轻松。 任何熟悉 C、C++、Java 或 JavaScript 的人都可以立即认出 C# 的大括号语法。通常情况下,了解上述任何一种语言的开发者都可在短时间内使用 C# 高效工作。
当然,如果再配合上宇宙第一的编译器Visual studio,那编程体验,不是任何一门别的语言能比拟的。
C# 可提供强大的功能,例如可以为 null 的类型、委托、Lambda 表达式、模式匹配和安全的内存访问;
C# 支持泛型方法和类型,因此增强了类型安全性和性能;
C# 可提供迭代器,使集合类的实现者可以定义客户端代码的自定义行为;
语言集成查询 (LINQ) 表达式让强类型查询成为最高级的语言构造;
作为面向对象的语言,C# 支持封装、继承和多态性这些概念。 虽然类可能会直接继承一个父类,但可以实现任意数量的接口。 若要用方法重写父类中的虚方法,必须使用 override 关键字,以免发生意外重定义;
在 C# 中,结构就像是轻量级类,是可以实现接口但不支持继承的堆栈分配类型;
C# 还可提供记录,这些记录是主要用于存储数据值的类型。
垃圾自动回收
异步操作,爽上天的异步流。
使用 C# 还可以通过以下多个创新语言构造轻松地开发软件组件:
封装的方法签名(“委托”),可实现类型安全事件通知;
用作私有成员变量的访问器的属性;
在运行时提供有关类型的声明性元数据的特性;
内联的 XML 文档注释;
语言集成查询 (LINQ),提供跨各种数据源的内置查询功能;
模式匹配,通过检查数据类型和值启用控制流;
反射支持,可以访问任何动态实例、类的元数据信息。
可以通过名为“互操作”的过程与本机组件交互。 借助互操作,C# 程序可以执行本机 C++ 应用程序可以执行的几- 乎任何操作。 在直接内存访问的情况下,C# 支持指针和“不安全”代码的概念。
C# 生成过程比 C 和 C++ 更简单,比 Java 更灵活。 没有单独的头文件,也不要求按特定顺序声明方法和类型。
C# 源文件可以定义任意数量的类、结构、接口和事件。
二、两种语言对比
2.1运行依赖
C++ 是编译型语言,编译器决定了其运行终端。C++最终不会直接接触终端平台,而是被编译成目标代码(机器码)直接驱动终端,这也是C ++运行效率高的原因。理论上C ++不依赖任何,只针对目标特性进行生产。这也是C ++实际生产中困难产生的原因。由于各家平台本质是有区别的,生产时不光需要遵守标准化要求还需要了解平台特性,否则会出现很多不稳定因素。
C# 是解释型语言,运行需要基于Microsoft .NET平台的应用程序,这使得C#不需要针对运行终端特性生产,大大提高了生产效率。C#被编译为中间代码,运行在 .NET 框架上,使得程序运行更加稳定,安全。C# 需要依赖 .NET 框架才能够运行,这是C# 的优点同时也是短板。
2.2编译型语言与解释型语言
描述的是语言的运行方式。编译型语言直接被编译为机器语言(执行层次更靠近原始驱动),执行效率更高。解释型语言是指在运行期间才进行编译,根据不同平台有差异化运行,跨平台特性更好。
编译型语言就如同我们去吃炒菜,厨师做好后我们直接可以吃,而解释型语言就如同我们吃火锅,吃之前需要先到锅里涮一涮。
2.3应用领域
C++ 多用于系统开发或是对性能要求、终端硬件驱动有特殊需求的产品设计中。例如游戏设计,网络服务器设计,数字图像,操作系统,系统软件,设备驱动程序,微型设备,嵌入式设备产品开发等。
C# 由于其具有较强的跨平台特性,开发速度快,迭代成本低,稳定而安全,多被应用在用户级产品设计中也多用于服务器产品设计中。例如游戏设计,桌面应用设计,网络设计,嵌入式产品设计等。
除去语言本身的特性外,C ++中的大部分产品可以使用C# 进行设计,C#中的产品亦可使用C++设计。需要我们了解,产品设计本身重在设计思路与实施,语言只是最后进行落地的手段,并不是绝对的哪种好。我们应该多分析产品特性,再进行技术栈选型。
2.4面向对象
C++ 与C#都是基于面向对象设计的语言。面向对象是一种软件设计思路,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。在设计程序时,我们需要将数据与方法看作是一个整体,针对同类型事物进行共性抽象,以提高程序设计的清晰性,独立性。
面向对象设计思路被广泛的应用在如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD 技术、人工智能等领域。
C#与 C++ 比较的话,最重要的特性就是 C# 是一种完全面向对象的语言,而 C++ 是既面向过程又面向对象的语言,另外 C# 是基于 IL 中间语言和 .NET Framework CLR 的,在可移植性,可维护性 和强壮性都比 C++ 有很大的改进
2.5性能差异
程序设计中,性能是我们必须要关注和思考的点,高性能意味着我们做同样一件事情花费更少的时间。C++ 相较于C#来说有运行效率的优势,主要由于C++被编译为目标代码,减少了运行时如同C#一样的解释时间。但是随着微软对于产品的优化和调整,在一些场景中C#的性能已经赶超C++,其优势逐渐凸显。但是在高密及CPU产品设计中C++ 还是有着绝对的优势。
2.6内存管理的不同
C#是在虚拟机上执行,会自动进行内存管理。
C ++需要手动组织管理内存。
C#为托管内存和自动垃圾回收,基于代(最对3代)的内存管理机制对所有对象采用引用追踪方法自动进行内存管理,也使得程序工作集减小优化,程序运行性能更快,而且一般不存在内存泄漏和内存安全漏洞问题,而C++可以进行原生态的内存管理,很多bug都是由于内存管理引起的;
2.7指针使用的区别
C#不支持使用指针,但可以使用一些不安全的类和方法;
C ++允许使用指针。不用指针的C#比C++更安全。指针引起的内存泄漏啥的问题还是蛮费脑的。
2.8系统环境(平台)的区别
C#主要用于Windows环境;
C ++是为基于Unix的系统设计的,但现在可以用于任何平台。
三、具体细节区别
封装上不同点
(1)C#一切皆对象,所有类均派生于Object类,数据结构基于对象,相比于C++的全局变量、宏、全局函数等,其对于面向对象性的支持更加极致;
(2)C#类成员除了数据成员(字段)和成员函数外,C#还增加了属性;没有了析构函数,对于静态类来说,可以定义静态构造函数,只有在初次引用静态类时执行静态构造函数(如果有的话);
(3)C#类的数据成员(字段)可以在类定义时初始化。
继承上不同点
(1)C#支持单继承,不支持多继承;
(2)相对于C++的另一不同之处是支持接口继承,只需要相应类实现接口定义的函数即可,派生类的对象除了赋值于基类对象外也可以赋值于接口对象。也是因为这个原因C#的多态性与C++也有不同,稍后叙述。
多态上不同点
(1)C#安全代码不支持指针,自然不能运用强大的指针去实现动态多态性,但是可以将派生类对象赋值于基类对象,通过基类对象的调用实现动态多态性;而C++调用基类对象执行成员函数却是执行了基类对象的相应的函数实现;
(2)C#还可以将不同类的对象赋值于其支持的接口的对象,这样可以通过调用接口对象的函数执行不同类对象的函数实现来实现动态多态性,不要求这些类有继承层次上的关系,而只需要都支持相应接口即可。(谁能看出这句话有问题?)
抽象上不同点
(1)类是对象的抽象,对象是类的实例。C#一切皆对象,且都派生于Object,任何数据结构都是基于对象的;
(2)在某些方面来说Object可以用来代替C++的指针实现需要的功能,想象一下,Wa~编程之美~
(3)C#的接口定义时,接口中的函数不必实现,而由支持接口的类实现,是不是很抽象~
值类型和引用类型
(1)C#所有类型分为值类型和引用类型两种,类类型为引用类型,其他为值类型;
(2)对于引用类型对象拷贝为浅度拷贝,而C++拷贝为生成副本再赋值(对应深度拷贝);若需在函数体内改变传递给函数参数的变量的值的话需要显示声明ref或out(对于值类型也有效);
其他
C#编译生成的是IL语言(中间语言),C#没有头文件;
C#Lambda表达式不仅可以简化编程,还可以将函数外变量作为“闭包变量”传送给函数,这一功能突破了很多严格限制,使编程更加灵活;Lambda表达式与扩展函数结合使用,嗯,编程之美~
C#委托的灵活使用可以简化设计模式,强化设计模式,尤其是用于UI交互设计模式,对程序员和软件用户十分友善~
C#有异步函数
C++的switch后面必须为整形(整形、布尔型和字符型),而C#增加了string类型的支持;
C#中所有对象都只能通过关键词“new”来创建,C++的“类名_对象名”方式在C#中变为声明一个引用。呵呵,万物皆对象,连常见的数据类型都变为对象了,JAVA味道很浓。
在C#里面,数组的元素都是存放在托管堆里面,比起C++的在内存里不确定位置申请一块连续空间要安全得多。
C++的switch后跟参数必须是int型,而C#却允许string型,这点改进觉得真的是比以前方便多了!
C#会禁止所有switch..case语句的失败情形,除非case语句后是空格,否则执行了前一个case语句就算没有break也会停止执行后面的case语句。
在异常处理上,C++允许抛出任何类型,而C#中规定抛出类型为一个派生于System.Exception的对象。
C++的宏在C#中被抛弃了很多,而且也不建议使用,因此很少见。
C++的模板在C#里没有了,但在C#中我们找到了能完成模板任务的更锋利的武器:委托。
C++的全局变量这一概念没有了,C#和JAVA类似,要把所有东西都放在类里面,还建议使用命名空间包含起来。
C#可以在定义类的时候直接给属性赋值,而C++这么做却会编译出错。
C#里有静态构造函数一个概念,这个构造函数只执行一次,因此能够保证一些静态成员只被初始化一遍。
C#更强的类型转换保护机制,比如说把float转成uint,直接转换0.35会变成0.34,是因为二进制无法表示这样的数字,使用System.Conver里的方法,可以安全地把类型安全转换过来。
委托与事件、装箱与取消装箱、Web Services……一大堆C++没有的新东西,我感觉是做大型项目方便了管理,也容易扩充,但做起小型项目,由于是编译成IL代码的,运行需要.NET Framework SDK支持,效率是个问题,不利于做那些对运算速度和内存消耗要求高的项目。
C# 的设计目标是用来开发快速稳定可扩展的应用程序,当然也可以通过 Interop 和 Pinvoke 完成一些底层操作,但是对于一些和底层系统相关很紧密的程序(譬如说驱动程序),还是建议用 C++ 来写
C++ 不允许在一个构造函数中调用另外一个构造函数(称为委派构造函数调用),而 C# 则允许。委派构造函数调用语法上非常自然和易懂,事实上, C++ 不提供这一特性并不是出于语法上的考虑,而是出于资源管理的考虑(这样的事情对 C++ 来说还有很多很多)。
C++ 的构造函数用于分配资源,而析构函数用于释放资源,构造函数和析构函数调用必须匹配,否则就打破了 C++ 的基本规则。如果允许委派构造函数调用,则显然会打破这一规则——构造函数被执行两次,而析构函数只执行一次。当然,对一些类,例如前面的那个 Point 来说这不是个问题,但是从语言机制的角度讲这个特性可能属于“危险”的特性。注:在最新的 C++ 标准提议草案中,Herb 等人有一个关于允许委派构造函数调用的提案,当然这很大程度上是为了方便 C++ /CLI 绑定。