ㄌㄐ@你的水潤餅大使
@raagi
Wed, Apr 20, 2022 2:49 PM
雖然很誇張但我好想問一個 C/C++ 基礎問題
寫小 code 的時候還行,但寫大結構的 code 的時候我發現我好像從來沒搞懂 pass by reference 跟 pointer 的 pass by value
ㄌㄐ@你的水潤餅大使
@raagi
Wed, Apr 20, 2022 2:50 PM
如果宣告一個 int a; &a 是直接去找 a 那個位置的值然後修改
這是 pass by reference
ㄌㄐ@你的水潤餅大使
@raagi
Wed, Apr 20, 2022 2:52 PM
Wed, Apr 20, 2022 2:52 PM
int
*p
; p 是指標所以他是一段位置,如果要改裡面的值要
*p
去改
ㄌㄐ@你的水潤餅大使
@raagi
Wed, Apr 20, 2022 2:53 PM
如果要把 p 指向 a 的位置,要 p = &a
ㄌㄐ@你的水潤餅大使
@raagi
Wed, Apr 20, 2022 2:56 PM
那如果今天有個 function 參數要傳 pass by reference
比如 int foo(int &a);
但我最初操作的是由一個指標做運算,之後我要把他當參數餵給 foo(),那我該傳什麼
*p ?
ㄌㄐ@你的水潤餅大使
@raagi
Wed, Apr 20, 2022 2:56 PM
還是 &(*p)?
ㄌㄐ@你的水潤餅大使
@raagi
Wed, Apr 20, 2022 2:57 PM
而且有時候用 smart pointer 的時候也會不知道要傳三小過去
Keeper
@servant_of_cthulhu
Wed, Apr 20, 2022 2:59 PM
前者。以 C++ 來說,pass-by-ref 跟 pass-by-pointer 基本上結果是一樣的,ref 一定程度上可以視為 pass-by-pointer 的一種 syntax sugar,省掉用 address-of (&) 取 address 跟用 * 去 dereference address 的麻煩。
TLDR; 用 pass-by-ref 使用上 syntax 跟一般的 pass-by-value 一模一樣,只是沒有用 const 的狀況下會有 parameter 被修改的 side-effect
ノワールみたいなPちゃん
@ProchainNoire
說
Wed, Apr 20, 2022 3:00 PM
Wed, Apr 20, 2022 3:17 PM
如果是by ref就是*p 或是 a
ノワールみたいなPちゃん
@ProchainNoire
說
Wed, Apr 20, 2022 3:01 PM
Wed, Apr 20, 2022 3:07 PM
但是pass by ref的缺點是不能檢查指標,也不能檢查是不是null,但是可以當作value操作,但是他在操作上還是指標操作,通常用於一定要存在的指標變數。
ノワールみたいなPちゃん
@ProchainNoire
說
Wed, Apr 20, 2022 3:02 PM
smart ptr看用的是哪種,最簡單好用的就只需要shared_ptr 如果是唯一性的指標用unique_ptr
ノワールみたいなPちゃん
@ProchainNoire
說
Wed, Apr 20, 2022 3:06 PM
Wed, Apr 20, 2022 3:10 PM
smart ptr只需要leave scope或是主動assign 其他ptr,只要ref count為0他自己就會delete ,如果想知道位址只需要call .get()取pointer,但是那個pointer是danlingpointer 能取用但是要注意contain他的share_ptr是不是已經reference count == 0 基本上不太會這樣用
ㄌㄐ@你的水潤餅大使
@raagi
Wed, Apr 20, 2022 3:07 PM
ノワールみたいなPちゃん
: 所以有點像有一半功能的 GC 這樣嗎
ノワールみたいなPちゃん
@ProchainNoire
說
Wed, Apr 20, 2022 3:09 PM
Wed, Apr 20, 2022 3:09 PM
算是 他是有RefereneceCount的,而 C++要有GC必須自己來XD,畢竟他是沒VM的Native語言XD
載入新的回覆
寫小 code 的時候還行,但寫大結構的 code 的時候我發現我好像從來沒搞懂 pass by reference 跟 pointer 的 pass by value
這是 pass by reference
*p
; p 是指標所以他是一段位置,如果要改裡面的值要*p
去改比如 int foo(int &a);
但我最初操作的是由一個指標做運算,之後我要把他當參數餵給 foo(),那我該傳什麼 *p ?
TLDR; 用 pass-by-ref 使用上 syntax 跟一般的 pass-by-value 一模一樣,只是沒有用 const 的狀況下會有 parameter 被修改的 side-effect