轉(zhuǎn)帖|其它|編輯:郝浩|2010-09-17 13:46:58.000|閱讀 571 次
概述:在C++和Java中都存在類引用,C++中是要明確指出的,顯性的;而Java中是隱形的,本文將講述類引用機(jī)制C++和Java的區(qū)別。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在C++和Java中都存在類引用,C++中是要明確指出的,顯性的;而Java中是隱形的。
在C++中,"T &b=a;" 說明b是a的引用,兩者是同名,指的同一個東西。而非指針的類聲明,就同時創(chuàng)建了一個類,如"T a;"實(shí)際上a已經(jīng)實(shí)例化了。而聲明類引用時不需要創(chuàng)建新對象,而是直接指向原來的對象。
類引用在函數(shù)的形參和返回值中起到很大的作用。默認(rèn)的類參數(shù),是通過復(fù)制函數(shù)(重載=運(yùn)算符),復(fù)制入?yún)⒁粋€新對象給函數(shù)體。函數(shù)中如果修改形參,不會對入?yún)⒂杏绊憽H绻祷刂狄彩穷悾敲匆矔ㄟ^復(fù)制函數(shù),構(gòu)造一個新對象返回給調(diào)用者。
如果形參采用類引用,那么函數(shù)將直接引用原有的入?yún)ⅲ藭r修改形參就會修改真實(shí)的入?yún)ⅰ7祷刂凳穷愐脮r,將不再使用復(fù)制函數(shù),而是直接將對象返回給調(diào)用者。如果返回的對象是局部變量,那么采用引用返回就會出錯。
在Java中,類實(shí)例聲明和構(gòu)造是分開。"T a;"是聲明,而"a=new T();"才是構(gòu)造。引用聲明和C++相同。但是Java的機(jī)制與C++不同,Java中的引用也叫句柄,或者說句柄才是其真實(shí)名稱。類聲明的都是一個句柄,調(diào)用構(gòu)造函數(shù)才會使得句柄指向類實(shí)例。因此Java中沒有類似于C++中的復(fù)制函數(shù),因?yàn)镴ava的復(fù)制都是直接復(fù)制句柄內(nèi)容。例如"T b=a;"只不過是將a的句柄復(fù)制(賦值)給了b,從而b也指向a指向的類實(shí)例。可以看出Java與C++在此處的不同,Java依然只有一個實(shí)例,而C++則存在了兩個實(shí)例。
所以在函數(shù)中,Java的形參都是入?yún)⒌木浔鷱?fù)制,并且是淺復(fù)制(只復(fù)制該句柄,而不復(fù)制句柄指向的下一層句柄)。因此在函數(shù)中,直接修改形參是不能改變?nèi)雲(yún)⒌摹5侨绻薷男螀⒅赶虻膶ο蟮南乱粚泳浔鷦t會修改入?yún)ⅰR虼嗽贘ava中不存在像C/C++中一樣的Swap函數(shù)。函數(shù)的返回值,也是句柄復(fù)制。如果在函數(shù)中構(gòu)造一個局部變量類實(shí)例,那么是可以返回到外部的,當(dāng)然那個局部變量的句柄是不存在了。
Java中要復(fù)制對象,需要重載clone函數(shù),并且要分清是淺復(fù)制還是深復(fù)制(完全構(gòu)造一個新對象,兩者的內(nèi)部數(shù)據(jù)和實(shí)例不存在重疊)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載