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

来源:http://www.cnblogs.com/vivid-stanley/archive/2017/01/22/6337612.html
-Advertisement-
Play Games

Java,C#已經比較熟悉,最近在從0開始自學C++。學習過程中必然會與Java,C#進行對比,有吐槽,也有點贊。 先來講講最基本也是最重要的部分:參數傳遞的方式。 對於類型, Java分基本類型、複合類型,從另外一個角度分是值類型,引用類型。在展開對比前, 我們先來看看三個關鍵方式: 值 創建新的 ...


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  }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在SuperSocket入門(二)中我們已經簡單瞭解了通過配置App.config文件使用BootStrap啟動SuperSocket服務。我們先來看一下上個案例中的基本配置文件示例: <?xml version="1.0" encoding="utf-8"?> <configuration> <c ...
  • 這個問題說起來,我有點慚愧 想當初在大學里學的就是ASP.NET WebForms 在實習期間也是用的WebForms來開髮網站,然後就覺得.NET開髮網站就是用這個開發模式 現在想想都想笑。。。實在忍不住了,我要笑了。哈哈哈!!! 好,回到正題 ASP.NET 是一個使用 HTML、CSS、Jav ...
  • 一、構造方法 類的構造方法是類的成員方法的一種,它的作用是對類中的成員進行初始化操作。類的構造方法分為: 1.靜態構造方法 2.實例構造方法 1.靜態構造方法 類的靜態構造方法是類的成員方法的一種,它的作用是對類中的靜態成員進行初始化操作。下麵請看代碼實例: 1 using System; 2 na ...
  • 1.直接在Global文件中配置: 1 var formatters = GlobalConfiguration.Configuration.Formatters; 2 var jsonFormatter = formatters.JsonFormatter; 3 var settings = js... ...
  • Mac系統上雖然自帶PHP和Apache,但是有時不是我們想要的版本呢。今天我們就在macOS Sierra(10.12.1)上安裝比較新的版本的PHP版本,也就是PHP7.0+了。本篇博客我們安裝的Apache是2.4的版本, MySQL5.7.16。稍後會詳細介紹這一過程。 一、安裝前的準備 1 ...
  • 題目描述 一條消息被編碼為一個文本流,被逐字元地讀取。這個流包含了一系列由逗號分隔的整數,每個整數都可以用C的int類型表示。但是,一個特定整數所表示的字元取決於當前的解碼模式。共有3種這樣的模式:大寫字母、小寫字母和標點符號。 在大寫字母模式下,每個整數表示一個大寫字母:這個整數除以27的餘數表示 ...
  • Q:Access denied for user 'root'@'localhost' 錯誤 A:第一種:配置文件中把資料庫的用戶名密碼再改一遍,把runtime里的文件刪除 第二種:修改system的host文件,關聯 127.0.0.1 localhost ...
  • 我們到底能走多遠系列47 扯淡: 又是一年新年時,不知道上一年你付出了多少,收穫了多少呢?也許你正想著老闆會發多少獎金,也許你正想著明年去哪家公司投靠。 這個時間點好好整理一下,思考總結一下,的確是個非常好的機會。 年終的時候各個公司總會評一下績效,拉出各位的成績單,你是不是想說:去你媽的成績單,我 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...