关于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異常。
轉載于:https://www.cnblogs.com/xiayou/p/4236841.html
總結
以上是生活随笔為你收集整理的关于c++跟java区别的几个总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unix和Windows比较
- 下一篇: 新建UE4 c++类