淺析C++函數(shù)參數(shù)與Java傳遞比較
對(duì)于C++函數(shù)參數(shù)與Java傳遞比較的問(wèn)題,相信這是許多技術(shù)人員和一些開(kāi)發(fā)人員的頭疼的一塊心病,看完本篇文章您就會(huì)了解什么是Java值傳遞,什么是C++函數(shù)參數(shù)值傳遞。
先說(shuō)Java,先做幾點(diǎn)說(shuō)明:
在Java中,無(wú)非就是兩種類型,即基本類型和從Object繼承下來(lái)的對(duì)象類型,而對(duì)象類型又包括String這種一旦初始化就不可改變內(nèi)容的類型和BufferString這種可以初始化后可以改變內(nèi)容的類型。然后看一下代碼示例:
- public class Test {
- public static void main(String args[]) {
- Integer interger1, interger2;
- int i, j;
- interger1 = new Integer(10);
- interger2 = new Integer(50);
- i = 5;
- j = 9;
- System.out.println("Before Swap, Interger1 is " + interger1);
- System.out.println("Before Swap, Interger2 is " + interger2);
- swap(interger1, interger2);
- System.out.println("After Swap Interger1 is " + interger1);
- System.out.println("After Swap Interger2 is " + interger2);
- System.out.println("Before Swap i is " + i);
- System.out.println("Before Swap j is " + j);
- swap(i, j);
- System.out.println("After Swap i is " + i);
- System.out.println("After Swap j is " + j);
- StringBuffer sb = new StringBuffer("I am StringBuffer");
- System.out.println("Before change, sb is <" + sb + ">");
- change(sb);
- System.out.println("After change sb is <" + sb + ">");
- }
- public static void swap(Integer ia, Integer ib) {
- Integer temp = ia;
- ia = ib;
- ib = temp;
- }
這很好解釋,對(duì)于基本類型諸如int,傳遞進(jìn)去的是存放int值的“內(nèi)存單元”的一個(gè)copy,所以函數(shù)swap里面的int和外面的int根本就不是一個(gè)東西,當(dāng)然不能反射出去影響外面
的int。而對(duì)于對(duì)象類型,我們同樣可以這樣認(rèn)為,C++函數(shù)參數(shù)傳遞進(jìn)去的是存放對(duì)象類型的指針的“內(nèi)存單元”一個(gè)copy(雖然Java里面沒(méi)有指針的概念,但這并不妨礙我們理解)。這樣,在swap函數(shù)里面,對(duì)其指針本身的值做任何操作當(dāng)然不會(huì)影響外面的Integer,因?yàn)閕nterger1和interger2的“內(nèi)存單元”里面的值是不變的,其指向的對(duì)象類型也是沒(méi)有變的。
然后這里需要說(shuō)明一個(gè)問(wèn)題,就是StringBuffer這種類型的對(duì)象了。因?yàn)槠鋬?nèi)容是可以改變的,所以change函數(shù)里面的“指針”通過(guò)類似“*”的操作,改變了StringBuffer對(duì)象的本身,就顯而易見(jiàn)了。(StringBuffer對(duì)象本身只有一個(gè)副本)然后說(shuō)C++了,里面的基本類型的諸如int的值傳遞大家都了然于胸,就不在這里廢話了。
然后另一種值傳遞可以稱為指針引用傳遞(pass-by-value argument of pointer)(這個(gè)類似上文說(shuō)的Java中的對(duì)象類型的值傳遞),可以通過(guò)*操作,改變指針指向的值。示例程序如下,一看便知:
- #include<iostream.h>
- int main(){
- void test(int*, const char*);
- int i = 1;
- int* iptr = &i;
- cout<<"Before pass-by-value:"<<"\n\n";
- cout<<"i = "<<i<<", It's value of i"<<endl;
- cout<<"&i = "<<&i<<", It's address of i and value of iptr"<<endl;
- cout<<"*iptr = "<<*iptr<<", It's value of i"<<endl;
- cout<<"iptr = "<<iptr<<", It's value of iptr and address of i"<<endl;
- cout<<"&iptr = "<<&iptr<<", It's address of iptr-self"<<"\n\n";
- test(iptr, "pass-by-iptr");
- test(&i, "pass-by-&i");
- return 0;
- }
這里的引用(reference)說(shuō)的明白一些,就是C++函數(shù)參數(shù)被傳遞參數(shù)的一個(gè)別名,或者更直接的理解就是被傳遞參數(shù)自己了,只是名字不同而已。那么既然自己都被pass過(guò)去了,那當(dāng)然可以在function里面為所欲為了。
【編輯推薦】
- 簡(jiǎn)介學(xué)習(xí)C++總結(jié)之談
- 對(duì)C++庫(kù)函數(shù)進(jìn)行學(xué)習(xí)探索總結(jié)筆記
- C++類庫(kù)設(shè)計(jì)的基本構(gòu)思與方法
- C++語(yǔ)言真的還有市場(chǎng)價(jià)值?
- C++類庫(kù)設(shè)計(jì)的基本構(gòu)思與方法
【編輯推薦】