程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++與Java,C#的異同(一):值,地址,援用

C++與Java,C#的異同(一):值,地址,援用

編輯:關於C++

C++與Java,C#的異同(一):值,地址,援用。本站提示廣大學習愛好者:(C++與Java,C#的異同(一):值,地址,援用)文章只能為提供參考,不一定能成為您想要的結果。以下是C++與Java,C#的異同(一):值,地址,援用正文


Java,C#曾經比擬熟習,最近在從0開端自學C++。學習進程中必定會與Java,C#停止比照,有吐槽,也有點贊。

先來講講最根本也是最重要的局部:參數傳遞的方式。

關於類型, Java分根本類型、復合類型,從另外一個角度分是值類型,援用類型。在展開比照前, 我們先來看看三個關鍵方式:

    • 創立新的正本,與原來的沒有關系
  • 地址(指針)

    • 把對象所在內存的地址傳遞過來
  • 援用

    • 可以了解為變量的別名

舉個例子:

 1 void testMethodA(int input) {
 2     input = 999;
 3 }
 4 
 5 void testMethodB(int* input) {
 6     //int newValue = 888;
 7     *input = 888;
 8 }
 9 
10 void testMethodC(int& input) {
11     input = 777;
12 }
13 
14 int main() {
15 
16     int input = 111;
17     cout << "Original: " << input << endl;
18     testMethodA(input);
19     cout << "After testMethodA: " << input << endl;
20     cout << input;
21     testMethodB(&input);
22     cout << "After testMethodB: " << input << endl;
23     cout << input;
24     testMethodC(input);
25     cout << "After testMethodC: " << input << endl;
26 
27     std::cin.get();
28 
29     // What is the value of input?
30 
31 }

運轉後的後果:

Original: 111
After testMethodA: 111
111After testMethodB: 888
888After testMethodC: 777

 

 解釋一下:

函數 testMethodA 的參數是值傳遞的,調用函數後,創立了一個input的正本,正本的值改動了, 但是input值沒有被改動。

函數 testMethodB 的參數是地址(指針)傳遞的,函數內修正了input指向的那塊內存區域,所以input的值也被改動了。

函數 testMethodC的行為看起來是和函數 testMethodB是一樣的, input值也被改動了,他們有什麼區別呢?

區別在於:

傳遞地址,函數內改動的是變量指向的那塊內存區域的內容。

傳遞援用,函數內改動的是變量的指向,換句話說,input指向的內存地址都變了。

 如下圖:

在C++外面,一切的類型,不論是根底數據類型,構造體,還是類,默許都是“值”傳遞的;顯式聲明為指針,才是傳地址;顯式聲明為援用,可以以為就是給變量起了一一般名。

在Java外面,只要根底數據類型(int, double, float等),是值傳遞的,一切的類對象,都是傳地址(留意,不是傳援用), 實踐上,java外面沒有援用傳遞的概念。

在C#外面, 根底數據類型,構造體, 默許都是值傳遞;一切的對象, 默許都是傳地址;假如想傳援用,在參數後面加ref關鍵字,例如:

1  void testMethodC(ref int input) {
2      input = 777;
3  }

 

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