程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> [引用區別] c++中引用與java中引用區別

[引用區別] c++中引用與java中引用區別

編輯:JAVA綜合教程

[引用區別] c++中引用與java中引用區別


綜述:

在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函數,並且要分清是淺復制還是深復制(完全構造一個新對象,兩者的內部數據和實例不相同)。

 

c++ 與java引用具體比較:

c++中一個引用指向的地址不會改變,改變的是指向地址的內容,然而java中引用指向的地址在變!!
如果非要對比著看,那麼Java中的“引用”倒是和C/C++的指針更像一些,和C++的“引用”很不一樣。

java去除指針概念,就用引用羅...
你看 java:
A a = new A(1);
A b = new A(2);
b = a;
沒有問題,a 和 b引用同一個對象A(2),原來的A(1)成為沒有被引用的對象。 垃圾回收機制會在之後的某個時刻把A(1)干掉。

而C++則不然。C++的引用就語義上說是“別名”【本質是個const指針,又叫指針常量】,而並不是指針的另一種用法:
A a = A(1);
A b = A(2);
A& c = b; //c 是 b的別名
c = a; //並不是 c 引用 a,而是拷貝操作 c.operator= ( a )

就語言機制來說,java的引用是用來管理和命名對象;
而,C++的引用機制是很純粹的,就是別名而已。

每種語言的特性都是整體的有機部分。

我們知道, java的引用機制是一個很復雜的機制。他必須區分“基本對象”和“復合對象”,你可以想象一下,如果其中沒有基本對象,那麼我們如何完成對象的復制? 唯一的解決方案是提供兩個等於號,或者一律用構造函數.... 但是綜合來看,他和垃圾回收形成了相當完美的組合方案。

而C++ 的引用機制為運算符重載提供了大幅度的支持。C++ 的引用是用類“模擬”基本對象的根本要求。 如果C++使用java那種引用,那麼原本漂亮的 operator[]、 proxy class 等就很難實現了。 更進一步, C++ 的運算符重載對 C++ 的模版機制提供了強力的支持

在c++中,引用只是對於一個變量起的別名,一旦定義就無法修改,即無法再指向其他變量,如程序中,對於a的引用的任何操作都等同於對於a的操作。

java定義的引用並不是這樣。在java中,引用相當與指針,它與c中的指針主要有兩個區別:一是引用不能進行地址操作,如數組的加一 操作,相當於引用只是只是指向數據的一個副本,而不是數據本身,這樣就避免了由於對於地址的誤操作而改變其他變量的值,甚至危害到系統的安全。二是 java中的引用只能指向對象,他的引用是在實例化對象時系統直接生成的,因此對於普通數據類型是不能進行引用定義的,如果要對普通數據類型進行函數調用 時的地址傳遞(即java中的引用傳遞),必須把數據封裝到類中。
java的這種特性使得在java的函數或類的參數傳遞時可以實現與c中指針相同的功能。

 

具體應用:

指針和引用在C++中很常用,但是對於它們之間的區別很多初學者都不是太熟悉,下面來談談他們2者之間的區別和用法。

1.指針和引用的定義和性質區別:

(1)指針:指針是一個變量,只不過這個變量存儲的是一個地址,指向內存的一個存儲單元;而引用跟原來的變量實質上是同一個東西,只不過是原變量的一個別名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定義了一個整形變量和一個指針變量p,該指針變量指向a的存儲單元,即p的值是a存儲單元的地址。

而下面2句定義了一個整形變量a和這個整形a的引用b,事實上a和b是同一個東西,在內存占有同一個存儲單元。

(2)可以有const指針,但是沒有const引用;

(3)指針可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)

(4)指針的值可以為空,但是引用的值不能為NULL,並且引用在定義的時候必須初始化;

(5)指針的值在初始化後可以改變,即指向其它的存儲單元,而引用在進行初始化後就不會再改變了。

(6)"sizeof引用"得到的是所指向的變量(對象)的大小,而"sizeof指針"得到的是指針本身的大小;

(7)指針和引用的自增(++)運算意義不一樣;

2.指針和引用作為函數參數進行傳遞時的區別。

(1)指針作為參數進行傳遞:

#include
using namespace std;

void swap(int *a,int *b)
{
  int temp=*a;
  *a=*b;
  *b=temp;
}

int main(void)
{
  int a=1,b=2;
  swap(&a,&b);
  cout<

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