程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 類引用機制C++和Java的區別

類引用機制C++和Java的區別

編輯:vc教程

  在C++Java中都存在類引用,C++中是要明確指出的,顯性的;而Java中是隱形的。


  在C++中,"T &b=a;" 說明b是a的引用,兩者是同名,指的同一個東西。而非指針的類聲明,就同時創建了一個類,如"T a;"實際上a已經實例化了。而聲明類引用時不需要創建新對象,而是直接指向原來的對象。


  類引用在函數的形參和返回值中起到很大的作用。默認的類參數,是通過復制函數(重載=運算符),復制入參一個新對象給函數體。函數中如果修改形參,不會對入參有影響。如果返回值也是類,那麼也會通過復制函數,構造一個新對象返回給調用者。


  如果形參采用類引用,那麼函數將直接引用原有的入參,此時修改形參就會修改真實的入參。返回值是類引用時,將不再使用復制函數,而是直接將對象返回給調用者。如果返回的對象是局部變量,那麼采用引用返回就會出錯。


  在Java中,類實例聲明和構造是分開。"T a;"是聲明,而"a=new T();"才是構造。引用聲明和C++相同。但是Java的機制與C++不同,Java中的引用也叫句柄,或者說句柄才是其真實名稱。類聲明的都是一個句柄,調用構造函數才會使得句柄指向類實例。因此Java中沒有類似於C++中的復制函數,因為Java的復制都是直接復制句柄內容。例如"T b=a;"只不過是將a的句柄復制(賦值)給了b,從而b也指向a指向的類實例。可以看出Java與C++在此處的不同,Java依然只有一個實例,而C++則存在了兩個實例。


  所以在函數中,Java的形參都是入參的句柄復制,並且是淺復制(只復制該句柄,而不復制句柄指向的下一層句柄)。因此在函數中,直接修改形參是不能改變入參的。但是如果修改形參指向的對象的下一層句柄則會修改入參。因此在Java中不存在像C/C++中一樣的Swap函數。函數的返回值,也是句柄復制。如果在函數中構造一個局部變量類實例,那麼是可以返回到外部的,當然那個局部變量的句柄是不存在了。


  Java中要復制對象,需要重載clone函數,並且要分清是淺復制還是深復制(完全構造一個新對象,兩者的內部數據和實例不存在重疊)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved