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

看板C_and_CPP作者 ( )時間4年前 (2019/09/13 09:18), 4年前編輯推噓1(100)
留言1則, 1人參與, 4年前最新討論串5/6 (看更多)
※ 引述《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++ 還要痛。 這方面就看你的本事了,或者看看板友有沒有學習資源可以提供給你。 -- Ling-hua Tseng Architect Research & Development Department Sky Mirror Technology Corporation -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.135.18.57 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1568337488.A.01B.html ※ 編輯: tinlans (220.135.18.57 臺灣), 09/13/2019 09:25:24

09/13 09:38, 4年前 , 1F
感謝詳盡的回覆 會好好查這些說明的內容
09/13 09:38, 1F
文章代碼(AID): #1TUkvG0R (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1TUkvG0R (C_and_CPP)