程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 淺析C++函數參數與Java傳遞比較

淺析C++函數參數與Java傳遞比較

編輯:C++入門知識

對於C++函數參數與Java傳遞比較的問題,相信這是許多技術人員和一些開發人員的頭疼的一塊心病,看完本篇文章您就會了解什麼是Java值傳遞,什麼是C++函數參數值傳遞。

先說Java,先做幾點說明:

在Java中,無非就是兩種類型,即基本類型和從Object繼承下來的對象類型,而對象類型又包括String這種一旦初始化就不可改變內容的類型和BufferString這種可以初始化後可以改變內容的類型。然後看一下代碼示例:

  1. public class Test {  
  2.  public static void main(String args[]) {  
  3.   Integer interger1, interger2;  
  4.   int i, j;  
  5.   interger1 = new Integer(10);  
  6.   interger2 = new Integer(50);  
  7.   i = 5;  
  8.   j = 9;  
  9.   System.out.println("Before Swap, Interger1 is " + interger1);  
  10.   System.out.println("Before Swap, Interger2 is " + interger2);  
  11.   swap(interger1, interger2);  
  12.   System.out.println("After Swap Interger1 is " + interger1);  
  13.   System.out.println("After Swap Interger2 is " + interger2);  
  14.   System.out.println("Before Swap i is " + i);  
  15.   System.out.println("Before Swap j is " + j);  
  16.   swap(i, j);  
  17.   System.out.println("After Swap i is " + i);  
  18.   System.out.println("After Swap j is " + j);  
  19.  
  20.   StringBuffer sb = new StringBuffer("I am StringBuffer");  
  21.   System.out.println("Before change, sb is <" + sb + ">");  
  22.   change(sb);  
  23.   System.out.println("After change sb is <" + sb + ">");  
  24.  }  
  25.  
  26.  public static void swap(Integer ia, Integer ib) {  
  27.   Integer temp = ia;  
  28.   ia = ib;  
  29.   ib = temp;  
  30.  } 

這很好解釋,對於基本類型諸如int,傳遞進去的是存放int值的“內存單元”的一個copy,所以函數swap裡面的int和外面的int根本就不是一個東西,當然不能反射出去影響外面

的int。而對於對象類型,我們同樣可以這樣認為,C++函數參數傳遞進去的是存放對象類型的指針的“內存單元”一個copy雖然Java裡面沒有指針的概念,但這並不妨礙我們理解)。這樣,在swap函數裡面,對其指針本身的值做任何操作當然不會影響外面的Integer,因為interger1和interger2的“內存單元”裡面的值是不變的,其指向的對象類型也是沒有變的。

然後這裡需要說明一個問題,就是StringBuffer這種類型的對象了。因為其內容是可以改變的,所以change函數裡面的“指針”通過類似“*”的操作,改變了StringBuffer對象的本身,就顯而易見了。(StringBuffer對象本身只有一個副本)然後說C++了,裡面的基本類型的諸如int的值傳遞大家都了然於胸,就不在這裡廢話了。

然後另一種值傳遞可以稱為指針引用傳遞(pass-by-value argument of pointer)(這個類似上文說的Java中的對象類型的值傳遞),可以通過*操作,改變指針指向的值。示例程序如下,一看便知:

  1. #include<iostream.h> 
  2.  
  3. int main(){  
  4.  void test(int*, const char*);  
  5.  int i = 1;  
  6.  int* iptr = &i;  
  7.  cout<<"Before pass-by-value:"<<"\n\n";  
  8.  cout<<"i = "<<i<<", It's value of i"<<endl;  
  9.  cout<<"&i = "<<&i<<", It's address of i and value of iptr"<<endl;  
  10.  cout<<"*iptr = "<<*iptr<<", It's value of i"<<endl;  
  11.  cout<<"iptr = "<<iptr<<", It's value of iptr and address of i"<<endl;  
  12.  cout<<"&iptr = "<<&iptr<<", It's address of iptr-self"<<"\n\n";  
  13.    
  14.  test(iptr, "pass-by-iptr");  
  15.  
  16.  test(&i, "pass-by-&i");  
  17.  
  18.  return 0;  

這裡的引用(reference)說的明白一些,就是C++函數參數被傳遞參數的一個別名,或者更直接的理解就是被傳遞參數自己了,只是名字不同而已。那麼既然自己都被pass過去了,那當然可以在function裡面為所欲為了。

  1. 簡介學習C++總結之談
  2. 對C++庫函數進行學習探索總結筆記
  3. C++類庫設計的基本構思與方法
  4. C++語言真的還有市場價值?
  5. C++類庫設計的基本構思與方法
  1. 簡介學習C++總結之談
  2. 對C++庫函數進行學習探索總結筆記
  3. C++類庫設計的基本構思與方法
  4. C++語言真的還有市場價值?
  5. C++類庫設計的基本構思與方法

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