Re: [問題] 使用指標的時機

作者: tinlans ( )   2019-09-13 09:18:05
※ 引述《PythonScript (Python)》之銘言:
: 拍謝 問問題果然還是要有技巧 0rz
: 貼 sample code 可能比較好
: https://pastebin.com/HhrqvaAz
: 我原本要問的問題就是 sample code 中的
: instanceA, instanceB, instanceAPointer, instanceBPointer
: 會不會有機會消失
所有區域變數離開它的 scope 後都會消失,但是你想聽的答案大概不是這個。
18 行的 instanceA 在 20 行 return instanceA 後就會消失。
createInstanceA() 傳回的是 instanceA 的複本,它已經不是 instanceA。
30 和 38 行的 instanceB 同理。
25 行的 instanceAPointer 是一個內部存放記憶體位址的變數,俗稱為 pointer。
在 26 行 return instanceAPointer 後就會消失。
createInstanceAPointer() 傳回的是 instanceAPointer 的複本,
它已經不是原本的 instanceAPointer。
45 行和 52 行的 instanceBPointer 也是同理。
不過你想聽的大概不是這個,而是 25 行 new classA 造出來的 instance 是否還存在。
在 C++ 裡 new 出來的東西沒 delete 就是會一直存在,
只是沒有 pointer 指到它的話,你就沒辦法 delete 它。
: (**問題1)
: 主要操作的對象是 instanceB, 會擔心 instanceB 身上掛的 instanceA 會消失
: 因為一直看到 C++ 的記憶體有可能會被取代, 所以要用指標 (還是這是我的誤解?)
我不清楚「C++ 的記憶體有可能會被取代」這一概念你是如何獲得的。
或許你需要好好說明一下。
總而言之這個說法非常奇怪,奇怪到我想知道你為什麼會有這種認知。
: 後來發現編譯不會過, 有點驚呆了
: 錯誤是寫發生在 Line 33
: Error C4700 uninitialized local variable 'instanceB' used
這照理說只是 warning,只是你開啟了將 warning 視為 error 的編譯選項。
: (**問題2)
: 所以 classB instanceB; 還是得初始化才行嗎
: 這就是板友說的有可能會無效?
class instanceB 是已經初始化了,classB 的 constructor 會被喚起。
只是因為你沒寫,使用了編譯器產生的 default constructor,
所以內部是 primitive data type 的 data members 都沒有初始化到。
32 行你替 PropertOfInstanceA 設了值,但 PropertOfInstanceAPointer 沒設,
可是你卻打算替這樣的 instanceB 製作複本,所以編譯器警告了這件事。
: (**問題3)
: 這樣看起來 C++ 也跟 C# 一樣, 必須要初始化才能用
這是你的誤解。
: 看過一些 C++ code, 都是沒 new 就直接用了
: 請問為什麼我會有這種錯覺 @@
C# 有分 value type 和 reference type,使用上的語法幾乎沒分別。
C++ 的 data type 標 * 才是 pointer,標 & 才是 reference,其它都是 value type。
* 和 & 有時會被 using 或 typedef 藏起來,不過本質還是一樣的。
如果你不知道 C# 有這特性,你可能得先複習一下你原本熟的 C#。
至少要能區分這兩種東西,還有它們背後的原理,包括 stack 和 heap 上各有什麼。
: 還是因為使用情況不同, 所以可以不用初始化就拿來用
: 再看回 sample, 下面這個比較早先出, 為什麼編譯器沒有顯示這個錯誤
: Line 17
: classA createInstanceA()
: {
: classA instanceA;
: return instanceA;
: };
因為你的 classA 沒有 data member,理由前面講了。
: (**問題4)
: 是因為 Line33 那一塊有執行
: instanceB.PropertOfInstanceA = passedInstanceA;
: 的關係嗎
不是,反而是你還缺了幫 instanceB.PropertOfInstanceAPointer 設值的那行。
: (**問題5)
: 那這樣的話, sample code 裡面的 instanceB
: 通通都得用 instanceBPointer 才能操作囉
因為並不是這樣,所以這問題就不回了。
: 拍謝 問一問都覺得自己是白癡, 我也很想有時間學跟有同事能問 0rz
我也知道在工作以後很難有時間好好學東西,但你還是得排出時間好好學。
你看起來是想依靠 C# 的知識無痛切換到 C++,結果踢到了鐵板。
世界上沒有這麼美好的事,你想這樣做還是得先徹底瞭解 C# 跟 C++ 的差異才行。
如果找不到詳述這些差異的學習資源,這可能比你從零開始學 C++ 還要痛。
這方面就看你的本事了,或者看看板友有沒有學習資源可以提供給你。
作者: PythonScript (Python)   2019-09-13 09:38:00
感謝詳盡的回覆 會好好查這些說明的內容

Links booklink

Contact Us: admin [ a t ] ucptt.com