黑马程序员技术交流社区

标题: C++与C#的区别 [打印本页]

作者: liinss    时间: 2014-7-19 11:25
标题: C++与C#的区别
本帖最后由 liinss 于 2014-7-25 10:09 编辑

C++与C#的区别
作者: suzhousongkan    时间: 2014-7-19 11:35
本帖最后由 suzhousongkan 于 2014-7-19 11:37 编辑

C#是这样的一种语言,具有C++的特点,象Java一样的编程风格, 并且象Basic一样的快速开发模型。
可以从:  程序结构  
                命名空间  
                数据类型  
                变量   
                运算符和表达式  
                枚举   
                语句(Statements )   
                类(Classes)和结构(Structs)  
                修饰符(Modifiers)  
                属性(Properties)
                接口(Interfaces)   
                法参数(Function Parameters)  数组(Arrays)   
                索引器(Indexers)  
                装箱及拆箱操作  
                委托(Delegates)   
                继承和多态
来比较。
作者: 向晓伟    时间: 2014-7-19 11:43
C/C++是编程语言,C++从C发展而来,而C++完全兼容C的语法.国际上有一个专门管理C++的机构,它们负责C++的标准制定.
C#是微软的一种高级编程语言,是微软自己制定的标准,它只是采用了C++的少数特性,跟C++不粘边.C#的特点是安全,用它编制的程序,不容易崩溃.但它的执行效率只有C++程序的几十分之一.
作者: StartHeiMa    时间: 2014-7-19 11:46
本帖最后由 StartHeiMa 于 2014-7-19 11:57 编辑

    转载:    没有什么语言能比C++更加贴近Windows本身了,这一点也是不可否认的。如果哪一天C#也能写驱动
的时候,那么C++就真的会淘汰了(这天可能不会太远又或者很遥远)。  
    C#能做的,C++不一定都能做,C++能做的,C#也不一定都好做,所以经常看到有人拿这2个语言对
比,我觉得确实没什么必要。  
    C#繁杂的调用Win32 API的方式,确实让人很不舒服,C++这一点做得比它好。但是,C#强大的网络
操作,代码量大大地低于C++,我们抛弃不用Socket,改用WinInet或是MFC中的封装好的网络类,比如
CHttpFile,还是没C#简单。C#的傻瓜式的类库操作和面向对象编程的完美特性,确实让其成为了Windows
平台上最受欢迎的语言。也许,是微软想将Win32 API渐渐地全部封装到C#的类库中去,我感觉微软有这
个意图,也许将来C#就不需要调用那些繁杂的Win32 API了,类库中均有提供也说不定。  
    我们为什么学VC?这点我曾经也问过自己。圣经上说:你必须知道真相,真相会使你自由。我们学VC
是为了自由,不受微软的框制。微软通过种种的FrameWork让你陷于其中,你觉得,哇,原来编程是这么
容易啊,几句话就能搞定。你想知道微软在内部干了些什么呢?你不知道,当然,你如果认为你没必要知道,
这个我完全赞同,我后面会说。就说杀进程吧,C#中不通过Win32 API就那么一种方式,通过
System.Diagnostics.Process找到进程,然后Kill之(如果我说的不对,使用C#的朋友请指正),而C++中,
我们完全有无数种选择,就说不邪恶的,TerminateProcess,邪恶点的呢?不计其数。进程内存填0,卸载模
块,消息洪水,句柄强制关闭,强制释放它的堆,太多太多了,甚至我注入进去,内部Raise一个异常,
它也就挂掉了。保护进程, 不管内核下还是应用层,C#肯定是做不了的,C++有自己高端的地方,其他语
言无法涉足。你见过C#做的杀毒软件吗?  
    C#极其简易的界面操作,令人看着很舒服的编码,他有太多的地方,C++根本无法涉足。拿C++做
Web Services除非是大脑进水,用C++做网络蜘蛛,也根本是无聊之举,要么就C#,要么就拿Python来干
(个人漏见),超级大量的数据,拿垃圾回收基本上为0的C++去做,简直就是自找麻烦。C#的WebForm,
和Jsp占据着Web的大片江山,C++能吗?不能。C#是一门博大精深的语言,类库强大到变态,基本上可以
这么讲,所以用C++的朋友也不能随便贬低C#程序员,C#的程序员的层次分得比C++多很多,高层的也
是象牙塔级别的。C#的架构师,那种恐怖的实力,C++中级程序员是无法想象的。C#更加注重于软件工程
的应用,各种设计模式的使用,C++则注重于实现功能。    C#的前景是不错的,我个人很看好它,MSDN 杂志每期的文章可能有8成是C#,C++不算很多,微
软的重心可能在C#上,希望C#逐渐能取代C++。但是C++会这么容易被取代?不可能。就像一个搞管理的,
你让他接管搞开发的人,让他从干一样到同时兼干这二样,会有这么简单么?c++的生命力至少还要7-8年,
之后才会渐渐的淡出,但是只要追求自由的人存在,C++就不会消失;只要操作系统一天是用C++写的,C++
就不会消失。  
    选什么语言,随自己高兴,需要哪个用哪个,这是不矛盾的。开发数据库,我倾向于用C#,做Windows
底层,我肯定是C++,都掌握下没有坏处。VS2010中C++的新特性各位同胞可以关注下,不知道会加入什
么,VC2008的特性我探索了这么久,还没有探索结束。C#是越来越好用了,Linq to Sql让不懂数据库的人
都能去操做数据库了,辅助一些第三方类库,能发挥强大的威力。完全取代C++,等操作系统是C#写的,
C#能开发系统中的一切组件的时候再说吧,至少现在C#还不能开发API,驱动吧?  
    最近在网上看到了很多人的学习方法,本人非常不赞同。很多人都想一口吃个胖子,要学就想学最新的,
好象没有人愿意再去学那些老的,旧的编程语言了。但你们能学的懂吗?不学TC2。0等那些较早的优秀
编程语言,你们能理解的了VC6。0?如果你真的能,我宁愿做你的徒弟!真是奇怪,那些最基本的语言
都不懂的人,怎么可能去理解那些最新的编程语言?我学编程有三年了吧。成绩也不算多,只有一个计算
机四级证和一个高程证,但我觉得我在学VC的时候还有很多的不明白的地方。没有人来教我,只能靠我
自己,包括所有的成绩在内,我都是靠自己,我从不报班。学VC的半年多来,我想我已经基本入门,但
依然有很多的困惑。刚开始学VC,就面临一个项目,我真的犹如笨蛋一般,四处吓摸,毫无头绪,最后勉
勉强强才算做个差不多。学好VC再去学其他的高级WINDOWS编程,我想那真是轻而易举,毕竟
WINDOWS的内部的很多东西都能直接被VC调用,你首先就可以对WINDOWS有个全新的认识,再去
学其他的语言岂能不简单?  
    我的感觉是,面向过程和面向对象,其实都很重要的,在VC里也依然需要面向过程,很多东西都是一环
扣一环,没有面向过程的思想,怎么可能去编程呢?建议多去看看有关WINDOWS编程的书,但多数都是
比较老的书呦!我依然记得当年整天进行TC编程的辛苦,但我依然很怀念当年的劳动付出,毕竟我获得
了我想获得的一切——编程思想。我觉得一个好的编程思想,绝对比你去学一门计算机语言好重要的多。
要形成自己的编程风格。一个好的编程思想在你的头脑中一旦形成,学习什么语言都会很轻而易举,因为
此时的你不在是简简单单的学习,而是来验证!




作者: StartHeiMa    时间: 2014-7-19 11:47
C、C++,C#三者区别
继承关系是C->C++->C# C++完全向C兼容,C程序几乎不用修改即可在C++的编译器上运
行.C++也称为带类的C,在C的基础上增加了许多面向对象的概念.虽然是C的扩展,但 并不意味
着C功能不如C++,最牛的操作系统是用C写的(不是C++哦).
C#是微软弄的一个东东,继承了C和C++的许多东西,但和两者基本上 已完全不一样了.你可以
把它当作一种全新的语言来学.
C语言是一种结构化编程语言。 它层次清晰,便于按模块化方式组织程序,易于调试和维护。
C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的
数据结 构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对
硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既 可用于系统软件的开发,
也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到
了各类各型计算机上,从而形成了多种版本 的C语言。
C++ 是在C的基础上改进后的一种编程语言,主要是增添了许多新的功能,难度也比C大,和
C一样侧重于计算机底层操作,也就是系统软件的开发。 C#是在C++的基础上再一次改进后的
编程语言,相比C++而言难度有所减小(微软是这么说的),侧重于网络和数据库编程。这3种
都是编程语言,语法基本 上是一样的,不过具体的内容差别还是挺大的。
VC++是一种编程软件,就相当于一个作业本,你学习了C++语言以后,就需要把这种编程语言
写在一 个作业本上,也就是写在VC这种编程软件上,来实现你需要的效果。  
鉴于当下形势, 如果要学的话就学 C#
C# 与 C++ 比较的话,最重要的特性就是 C# 是一种完全面向对象的语言,而 C++ 不是,另
外 C# 是基于 IL 中间语言和 .NET Framework CLR 的,在可移植性,可维护性 和强壮性都
比 C++ 有很大的改进
C# 的设计目标是用来开发快速稳定可扩展的应用程序,当然也可以通过 Interop 和 Pinvoke
完成一些底层操作,但是对于一些和底层系统相关很紧密的程序(譬如说驱动程序),还是建议
用 C++ 来写
C++ 不允许在一个构造函数中调用另外一个构造函数(称为委派构造函数调用),而 C# 则允
许。委派构造函数调用语法上非常自然和易懂,事实上, C++ 不提供这一特性并不是出于语法
上的考虑,而是出于资源管理的考虑(这样的事情对 C++ 来说还有很多很多)。
C++ 的构造函数用于分配资源,而析构函数用于释放资源,构造函数和析构函数调用必须匹配,
否则就打破了 C++ 的基本规则。如果允许委派构造函数调用,则显然会打破这一规则——构造
函数被执行两次,而析构函数只执行一次。当然,对一些类,例如前面的那个 Point 来说这不
是个问题,但是从语言机制的角度讲这个特性可能属于“危险”的特性。注:在最新的 C++ 标准
提议草案中,Herb 等人有一个关于允许委派构造函数调用的提案,当然这很大程度上是为了方
便 C++ /CLI 绑定。
在 C++ 构造函数中,虚函数调用会被编译器自动转为普通函数调用,而在 C# 构造函数中允
许进行虚函数调用。 C++ 这样处理自然有它的原因——在 C++ 中,构造函数执行完成后对象
才初始化好,对于多态对象来说,也就意味着构造函数在背后执行了很重要的一件事情——初始
化对象的虚函数表。
如 果我们在基类的构造函数中调用了虚函数,则因为此时对象的虚函数表仍旧是基类的虚函数
表,所以无法进行正确的虚函数调用。
也就是这个原因,通常我 们应该避免在构造函数中调用虚函数,因为它违背了虚函数的语义。
而在 C# 中,在对象的构造函数执行之前对象的类型信息就已经初始化好了,所以可以进行正
常的虚函数调用。
基本上,这些就是两者之间的区别
作者: 深夜的空气    时间: 2014-7-19 11:52
苏坤老师说 C++是牛xx    C#是牛xxxx
作者: 天佑の清清    时间: 2014-7-19 12:06
c++在设计之初希望提供先进的面向对象特性,同时提供很好的性能。但是为了保证和以往的程序、开发人员的知识兼容,c++与c语言几乎完全兼容。c语言本身其实就是现代计算机的高级抽象,可以直接访问地址、通过指针可以访问几乎任何内存地址;堆和栈的结构体现等待。当然c++也就具有了这样的特性。随着 c++的逐步发展,generic programming 泛型编程技术和stl标准模板库的引入,c++和c的差异越来越大。基本上c++是为了高效地使用面向对象技术或者泛型技术编写大规模高性能应用程序(往往是一些相对比较底层的应用程序)而设计的。

c#通过底层的虚拟机机制减少了c/c++语言中常常容易发生的内存泄漏和安全性问题,代价是运行速度减慢。同样的由于简化了编程语言的复杂性(c#远远比c++来得简单),大大提高了开发者得效率。另外c#具有.net庞大的类库,这个优势是c++所不具有的。因此c#非常合适开发企业中处理业务的应用程序。同时微软所有的操作系统、服务器程序、桌面端程序都在向.net平台统一。在历史上与次类似的情形(指微软技术)只有在微软从16位平台向32位平台转变的过程中发生过。因此现在.net的转变对开发者来说可能是痛苦的(因为要学习很多新的东西),但也充满了机会。

作者: 天佑の清清    时间: 2014-7-19 12:07
c++在设计之初希望提供先进的面向对象特性,同时提供很好的性能。但是为了保证和以往的程序、开发人员的知识兼容,c++与c语言几乎完全兼容。c语言本身其实就是现代计算机的高级抽象,可以直接访问地址、通过指针可以访问几乎任何内存地址;堆和栈的结构体现等待。当然c++也就具有了这样的特性。随着 c++的逐步发展,generic programming 泛型编程技术和stl标准模板库的引入,c++和c的差异越来越大。基本上c++是为了高效地使用面向对象技术或者泛型技术编写大规模高性能应用程序(往往是一些相对比较底层的应用程序)而设计的。

c#通过底层的虚拟机机制减少了c/c++语言中常常容易发生的内存泄漏和安全性问题,代价是运行速度减慢。同样的由于简化了编程语言的复杂性(c#远远比c++来得简单),大大提高了开发者得效率。另外c#具有.net庞大的类库,这个优势是c++所不具有的。因此c#非常合适开发企业中处理业务的应用程序。同时微软所有的操作系统、服务器程序、桌面端程序都在向.net平台统一。在历史上与次类似的情形(指微软技术)只有在微软从16位平台向32位平台转变的过程中发生过。因此现在.net的转变对开发者来说可能是痛苦的(因为要学习很多新的东西),但也充满了机会。

作者: 天佑の清清    时间: 2014-7-19 12:09
1.继承:C++支持多继承,C#类只能继承一个基类中的实现但可以实现多个接口。
2.数组:声明 C# 数组和声明 C++ 数组的语法不同。在 C# 中,“[]”标记出现在数组类型的后面。
3.数据类型:在C++中bool类可以与整型转换,但C#中bool 类型和其他类型(特别是 int)之间没有转换。long 类型:在 C# 中,long 数据类型为 64 位,而在 C++ 中为 32 位。
4.struct 类型:在 C# 中,类和结构在语义上不同。struct 是值类型,而 class 是引用类型。
5.switch 语句:与 C++ 中的 switch 语句不同,C# 不支持从一个 case 标签贯穿到另一个 case 标签。  
6.delegate 类型:委托与 C++ 中的函数指针基本相似,但前者具有类型安全,是安全的。
7.从派生类调用重写基类成员。 base
8.使用 new 修饰符显式隐藏继承成员。
9.重写方法需要父类方法中用virtual声名,子类方法用override 关键字。
10.预处理器指令用于条件编译。C# 中不使用头文件。 C# 预处理器指令
11.异常处理:C#中引入了 finally 语句,这是C++没有的。
12.C# 运算符:C# 支持其他运算符,如 is 和 typeof。它还引入了某些逻辑运算符的不同功能。
13. static 的使用,static方法只能由类名调用,改变static变量。
14.在构造基类上替代 C++ 初始化列表的方法。
15.Main 方法和 C++ 及Java中的 main 函数的声明方式不同,Main而不能用main
16.方法参数:C# 支持 ref 和 out 参数,这两个参数取代指针通过引用传递参数。  
17.在 C# 中只能在unsafe不安全模式下才使用指针。
18.在 C# 中以不同的方式执行重载运算符。
19.字符串:C# 字符串不同于 C++ 字符串。
20.foreach:C#從VB中引入了foreach关键字使得以循环访问数组和集合。
21.C# 中没有全局方法和全局变量:方法和变量必须包含在类型声明(如 class 或 struct)中。
22.C# 中没有头文件和 #include 指令:using 指令用于引用其他未完全限定类型名的命名空间中的类型。
23.C# 中的局部变量在初始化前不能使用。
24析构函数:在 C# 中,不能控制析构函数的调用时间,原因是析构函数由垃圾回收器自动调用。 析构函数
25构造函数:与 C++ 类似,如果在 C# 中没有提供类构造函数,则为您自动生成默认构造函数。该默认构造函数将所有字段初始化为它们的默认值。
26.在 C# 中,方法参数不能有默认值。如果要获得同样的效果,需使用方法重载。
其实有很多相通的地方。希望对你有所帮助。
作者: 渐渐的起飞    时间: 2014-7-19 17:04
深夜的空气 发表于 2014-7-19 11:52
苏坤老师说 C++是牛xx    C#是牛xxxx

楼主是不是想知道的就是这个结果?
作者: 小郭zaiheima    时间: 2014-7-20 00:25
我是来看回帖的。。看帖回帖也是一种享受
作者: 乔相坤    时间: 2014-7-20 08:59
过来学习一下
作者: FrancisTan    时间: 2014-7-20 17:08
我也是来看回贴的,学到不少,谢谢他们!
作者: 周星星同学    时间: 2014-7-20 20:57
C++想学好是很难的,尤其像QQ这样的软件,做起来其实很恶心的,里面不知道要搞多少层指针呢。但是C++由于有指针的概念,所以使用起来更加灵活,可以做到其他任何一种语言所做不到的事,而C#像java一样,根本就没有指针,很多事就必须采用绕行的方式,这点就不如C++了。所以你要是有能力,学C++就最有前途了。不过C#也有自己的优势,比如他像java一样有很多封装好的类,大量的系统方法和重载方法,使得编程变得非常容易,省去很多代码,也就是写程序会很容易,而且,C#和很火的java又很像,其实学会了C#,很多语言就都可以用了,而不需要在学一遍了。
作者: 周星星同学    时间: 2014-7-20 20:58
表示仅供参考。。。。高手的回答
作者: liinss    时间: 2014-7-25 10:05
谢谢大家的帮助
作者: liinss    时间: 2014-7-25 10:10
StartHeiMa 发表于 2014-7-19 11:46
转载:    没有什么语言能比C++更加贴近Windows本身了,这一点也是不可否认的。如果哪一天C#也能写驱动 ...

请问我怎么能给你技术分?
作者: liinss    时间: 2014-7-25 10:11
天佑の清清 发表于 2014-7-19 12:09
1.继承:C++支持多继承,C#类只能继承一个基类中的实现但可以实现多个接口。
2.数组:声明 C# 数组和声明 C ...

请问怎么能给你技术分
作者: 天佑の清清    时间: 2014-7-25 11:09
liinss 发表于 2014-7-25 10:11
请问怎么能给你技术分

这个是版主的事  不是你  也不是我的事
作者: 官方    时间: 2014-9-5 09:19
c#更牛xxxx




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2