發表文章

目前顯示的是 7月, 2020的文章

C/C++筆記 : Pass by Value 與 Pass by Reference 與 Pass by Address的差別

圖片
剛剛作為新鮮人在公司感覺有點被再教育了的感覺,一方面可能也是C#跟Java這種寫習慣了突然換回大一在用的C++結果被洗臉的感覺。再次感受到C#真的是很容易上手的語言,也重新回想起C++的pointer難關的感覺。 不過關關難過還是得要關關靠腰關關過(嘆),趕快趁著好人主管教完來做個筆記。 先來張可愛的ミク壓壓驚 喔,爽 ------------------------------------------------ 這邊自己覺得要先講一下C++變數的概念。 C++用了兩個容器來存所有的變數 如果你是用 new 出來的變數,他到死都不會被delete和釋放出記憶體空間。 這類變數會被放在Heap中 而其他非透過new的來宣告建立instance化的變數則是會被放在stack中,並有自己的生命周期(注意看一下{ }包到哪裡) 範例中的class結構 :  Pass by Value 其實就是我們一般在C# / Java的那種寫法,沒有指標,沒有地址 使用這種傳法在C++的話會有一個情況需要去注意。 那就是, 他並不是把你的參數傳進去,而是copy了一份你的參數內容然後在收到的那個function內產生一個一樣的變數去接你copy出來的結果 ,也就是說 你在這邊修改變數的值,並不會直接連動影響到外部的值 ,兩邊變數的生命週期並不一樣,因為是兩個不一樣的變數。(C#就會連動了,這跟C#的特性有關 ,所以珍惜生命遠離C++) 然後我們在main裡寫這樣一段程式 :  最後結果: 在main裡面的Point pt此一物件,存在0042FC1C這個記憶體位置 外面function中的p, 他接了pt的資料,但是並不是pt本身 ,是新創的一個變數,存在0042FB44這個記憶體位置中 外面function中的p, 0042FB44這個記憶體位置裡面存了數值2 但是在main裡面的Point pt,存在0042FC1C ,因此外面function中的p (0042FB44)裡面的值變為2的時候,Point pt (0042FC1C)裡面的oint pt (0042FC1C)裡面的值並沒有跟著變, 所以main裡面的pt並不會收到p的變化,因為已經是兩個分開出來的兩個變數了 Pass by Reference  以往以為Pass by reference就是用pointer來傳值這樣。