A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liletian2104 中级黑马   /  2014-6-20 09:58  /  1031 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁能讲一下,Java、  C++ 、 C#的根本区别在哪里??

5 个回复

倒序浏览
JAVA  单继承 C#单继承    C++ 无限继承    JAVA 主要做网页 网站     C# 不是很了解  C++  基本上啥都能做就看你的水平了
回复 使用道具 举报
一、关于声明和定义

在c++中一定要严格区分声明(不分配内存但在obj符号表中登记)和定义(分配内存)的区别,而在c#和java中我认为可以不用区分,就当没有声明这个概念,只有定义这个概念。原因是c++中的cpp文件都是要分别独立编译的,所以编译某个cpp时,是根本看不到其它cpp中有什么内容的,所以如果用到其它cpp中的符号(如变量),这些符号必须在这个要编译的cpp中声明,表示这个符号是“自己人”,只不过符号具体是什么内容以后链接时在其它cpp编译生成的obj文件中找。



二、关于引用

在c++中引用本质是个“常指针”,所以一定要在定义(分配内存)时初始化。在c#和java中引用本质是个“指针”,所以可以先定义,以后初始化。

c++中引用要用显示的“&”符号声明,而c#和java中不需要。

且在c++中类名就相当于一个变量名,如:Class A;语句中的A对象就相当于int a;语句中的a,A和a都是一个变量,代表一块内存。而在c#和java中,Class B;语句中的B是一个引用(指针),并不是一个变量,并不像int b;语句中的b,b直接代表变量所在内存的地址,而B直接代表的是指针的地址,它要拐个弯才能指向实际对象变量空间(当然实际写代码时不用想那么多)。

明白了上面所述区别后,看下面代码:string s1="abc"; string s2="def"; s1=s2;

在c++中,通过重载等号运算符,将s2中的内容复制到s1中,s1和s2代表的变量内存位置不变。

在c#和java中,会先丢弃s1指针所指的内存空间(垃圾回收自动执行),然后将s2引用的地址复制给s1引用,也就是s1和s2都存放了“abc”串所在空间的地址。



三、c++中的include;c++和c#中的using;java中的import

include就是把头文件内容原样复制到所在位置;using就是引入名字的复姓;import具有目录搜索(目前由于刚学习java,所以还不确定)和引入名字复姓两个功能。

重要的是,这三个语言都是怎么找到第三方写的类的(c++中找lib,c#找dll,java找class)。

c++中通过设置项目的“附加依赖项”或语句“pragma comment(lib,"..\\..\\ss.lib")”来把第三方写的代码加入到本项目中(就好像是自己写的cpp一样),但第三方的头文件中定义的各种符号的声明要通过include复制到需要的cpp中。编译某个cpp遇到不认识的符合在本cpp中的“符号表”中找。

c#中通过“添加引用”来把第三方dll库加入到自己所在的程序集中,以后要用到某个不认识的符合就到程序集中找。

java中(还不确定),直接通过import语句将对应目录下的或包的各种符号导入到程序集中(java中)
回复 使用道具 举报
C#和Java很像的,他就是借鉴Java写出来的
回复 使用道具 举报
java用途广,网页、手机小游戏、Android等的逻辑代码都可以。C++一般用于windows做桌面应用程序和接触底层的库文件。C#没接触过
回复 使用道具 举报
常乃伟 发表于 2014-6-20 11:03
一、关于声明和定义

在c++中一定要严格区分声明(不分配内存但在obj符号表中登记)和定义(分配内存)的区 ...

解释的很详细啊!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马