前敘
From Java to C++ 第一篇
From Java to C++ 第二篇
風格逆轉(zhuǎn)
前面兩篇,以java代碼實例的對比,來做了快速的C++轉(zhuǎn)型,但其實那樣根本不夠,因為在任何一門語言里,最終拼的都是細節(jié)處理,為什么C++這么的難學,其實也是細節(jié)夠多,知識點夠復雜導致的,所以接下來我們就針對C++中,也是相對java所特有的一些特性,逐一學習,當然也會有對應的代碼舉例,來輔助理解。
大家都知道Java中有值傳遞和引用傳遞,但在C++中,又多了個指針傳遞,這到底是怎么回事呢?下面就一起一探究竟。
值傳遞
image.png
特點:
- 形參是實參的拷貝,改變形參的值并不會影響外部實參的值。
- 當函數(shù)內(nèi)部需要修改參數(shù),并且不希望這個改變影響調(diào)用者時,采用值傳遞。
指針傳遞
image.png
特點:
- 形參為指向?qū)崊⒌刂返闹羔?,當對形參的指向操作時,就相當于對實參本身進行的操作
- 方法里,用*a 操作指針
- 調(diào)用方法時,需用&修飾實參
為什么用&修飾實參
這就跟&和*在修飾變量名時的作用有關(guān)
- &b 取b的值地址,它被定義為取地址運算符
- a 取a的值 ,它被定義為間接尋址運算符,*返回操作數(shù)所指定地址的變量的值
在指針傳遞中,傳入地址&b,然后在該函數(shù)中,通過*a取出&b的地址的值,再進行相關(guān)操作。有點繞,但還算可以理解。
引用傳遞
image.png
特點:
- 形參相當于是實參的“別名”,對形參的操作其實就是對實參的操作
- 行參作為局部變量在棧中開辟了內(nèi)存空間,并指向?qū)崊⒆兞康牡刂?/li>
- 對形參做的任何操作都影響實參變量
指針和引用的區(qū)別
指針和引用都可以通過行參改變實參的值,那么它們到底什么區(qū)別呢?
其實這個跟引用規(guī)則有很大的關(guān)系,來看下引用的規(guī)則:
- 引用被創(chuàng)建是必須初始化
- 不能有NULL引用
- 一旦應用被初始化,就不能改變引用關(guān)系
而指針以上規(guī)則都沒有限制,那是為什么呢?其實指針傳遞本質(zhì)上是值傳遞的方式,它所傳遞的是一個地址值。其實很多人對這個都不太好理解,你可以這么理解,我們都知道Java多線程中,操作共享內(nèi)存的變量時,其實都是從共享內(nèi)存中copy到自己的內(nèi)存區(qū)域中,相當于一個副本,最終操作完以后再同步到共享內(nèi)存中,達到一個閉環(huán),你可以這么理解指針,但它原理并不是我說的這樣,僅供輔助理解。
該如何選擇
你可以將指針作為更加靈活的引用使用,當不滿足引用規(guī)則的時候就使用指針,就這樣。