关于c++跟java区别的几个总结

之前c++,最近java有点混乱,总结一下:

1.在写java程序的时候会发现,假如你自己写了一个类class A{。。。},这个时候你要实例化,必须new一个;但是在c++里面就不用,c++中你可以直接声明A a;

为何:

  a.java里面所有变量都是引用(除了基本类型),引用就相当于一个指针,因此你必须要new,不然没法使用;当然在c++里面,指针可以光声明,扔在那里不new,你用的时候还是要new的,java编译器在安全方面做出了优化。

  b.c++里面,A a;这句运行时,会自动调用默认构造函数,给你构造一个出来,这是一个实例对象,不是引用,A中的field是有值的,不过这个值可能是一个你不想要的。

2.关于RTTI的实现机制,java跟c++是不同的,但原理是一样的:

  a.java如果实现RTTI,很简单,java的每个类都生成一个class文件。比如现在有一个基类shape,其子类有circle,square等。有一个vector i,在java中,vector如果没有被泛型化,可以放入任何object。这时你可以把circle,square都放进去,upcasting。取出来的时候,需要downcasting回shape,比如(shape)i[0],这时在java中会进行RTTI,但是这种括号形式的造型,在c++中不会进行RTTI,只会被强制转换为()中类型。那RTTI如何进行呢,因为每个类都是一个class,被加载到内存中后,字节码是不同的,因此可以方便进行RTTI。

  b.c++中,也有RTTI,在dynamic_cast跟typeid中进行。很容易推测,要进行RTTI就要需要知道类的信息,在java中有Class类记录类型信息,其实在c++中也有type_info,(个人认为这两个东西,本质上是一样的),只是很少人用到。因此,在c++中,RTTI的进行依据是type_info。

  c.别的还木有看,只看了dynamic_cast的运作原理:dynamic_cast是类型转换,upcast比较好理解,但downcast,这里如何操作的呢?当类中存在虚函数时,编译器就会在类的成员变量中添加一个指向虚函数表的vptr指针,每一个class所关联的type_info object也经由virtual table被指出来,通常这个type_info object放在表格的第一个slot。当我们进行dynamic_cast时,编译器会帮我们进行语法检查。如果指针的静态类型和目标类型相同,那么就什么事情都不做;否则,首先对指针进行调整,使得它指向vftable,并将其和调整之后的指针、调整的偏移量、静态类型以及目标类型传递给内部函数。其中最后一个参数指明转换的是指针还是引用。两者唯一的区别是,如果转换失败,前者返回NULL,后者抛出bad_cast异常。

时间: 2024-10-27 12:48:56

关于c++跟java区别的几个总结的相关文章

c++和java区别之彩38平台出售

从概念上讲,java字符串就是Unicode字符序列.彩38平台出售(企 娥:217 1793 408) 1,提取子串 String类提取子串的方法是substring方法,例如:String str = "hello"; String substr = str.subdtring(0,4);,在这里,第一个参数是起始位置,第二个参数是不想复制的第一个位置或者说是截止位置.结果就是"hel". 2,字符串拼接 java语言与C++语言一样,都支持使用"+&

java 区别“==”和equals()方法

/* Object是所有类的父类: 它有一个equals方法,这个方法是用来比较两个对象的引用是否相同,而不是比较对象内容是否相同. "=="比较的是两个对象的引用,Object中的equals方法比较的也是两个对象的引用.所以在Object类中==和equals的作用是一样的. 所以在子类中一般会重写覆盖此equals方法,使得equals方法实现比较对象内容是否相同的功能.这时==和equals的功能就不一样了. ==还适用于比较对象引用,而equals是用于比较对象(具体来说是对

白话说java gc垃圾回收

gc是java区别于其他好几门语言(c/c++)的一个代表功能(当然也有很多可以自动管理内存的语言,如所有的脚本语言,你根本不知道内存管理这回事)! 当然,之所以要把c/c++和java相比,是因为java出现的初衷即是对标c++的缺点的.不管怎么样,gc让程序员gg们不用痛苦地管理内存,这是好事! 回归正题,gc是什么?小白:Garbage Collect 垃圾回收(内存),是一种自动管理内存的一种机制! 下面,我们分几个问题来讨论gc的实现及原理! 一条主线(如果是你会怎么做?): 1. 什

js08--函数1

函数当成类看当成匿名对象看,都是跟java吻合的,只有当成函数看(函数自己可以执行)跟java区别在这里. function fact(){} var F = fact ; 函数名是函数对象的地址,是地址就有内存区域,执行就是地址名()小括号,var f = new F(),f就不是指向函数F的地址了,他是F类的对象,他的地址里面是对象,不仅仅是一个函数. function fact(num){ if(num <=1) return 1 ; else return num*fact(num-1)

Scala初步学习

scala语言1.scala特点兼容性,简短,高层级抽象?,和高级的静态类别?1.兼容性,可以和java实施互操作scala的程序可以被编译成JVM(java虚拟机)的字节码,访问Java字段,调用java方法,继承java类和实现java接口,几乎所有的scala代码都依赖于java库 scala与java区别java里面既可以比较原始类型也可以比较参考类型,对于原始类型,java 的==比较值得相等性,如scala对于参考类型,java的==比较的是参看相等性,也就是说两个变量事都指向了,j

【黑马程序员】第2课:JavaScript基础

<pre> day02 第一天的内容: *html标签里面的表单标签 *html标签里面的表格标签 JavaScript 1.JavaScript的简介 * 什么是JavaScript:js是一个基于对象和事件驱动的语言,应用客户端. **基于对象:在java里面如果使用对象需要创建:在js里面提供一些对象,直接使用 **事件驱动:每次调用事件产生一个新的效果 **客户端:专门指的浏览器 *js可以做什么:js可以实现一些简单的动态的效果 * js三个特点: **基于事件驱动的 **安全性特点

JSP技术基础(动态网页基础)

JSP不能直接运行,需要翻译. Jsp执行过程 翻译阶段 Jsp被web容器中的jsp引擎转换为java源码 .class 编译阶段 源码被翻译为.class文件,字节码文件. 执行阶段 部署服务器的过程其实就是编译的过程,web获取客户端的请求后,web开始执行字节码文件. 如果内容被更改,需要重新部署 系统里面有原来的.class文件,就会执行原来的文件,不会执行这个. ? Jsp页面的组成: 静态内容:html静态文本 指令 : <%@ 开始 %> 结束 表达式 :<%=java表

salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句

salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex语言和java很多的语法类似,今天总结的是一些简单的Apex的变量等知识. 有如下几种常用的基本变量Integer,String,Decimal,Double,Long,Boolean,ID. 集合常用的对象:List<T>,Set<T>,Map<T>. 时间日期常用对象:Datetime,Time,Date. 其他:Object,sObject(与数据库相关

JS总览

实际上,一个完整的JavaScript实现是由以下3个不同部分组成的:核心ECMAScript.浏览器对象模型BOM.文档对象模型DOM. 一.核心的ECMAScript ECMAScript可以为不同各类的宿主环境提供核心的脚本编程能力,因此核心的脚本语言是与任何特定的宿主环境分开进行规定的.Web浏览器对于ECMAScript来说就是一个宿主环境,但它并不是唯一的宿主环境.在ECMAScript描述了以下的内容:语法.变量.关键字.保留字.原始值和引用值.原始类型和引用类型.类型转换.运算符