C_and_CPP 板


LINE

※ 引述《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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1568337488.A.01B.html ※ 編輯: tinlans (220.135.18.57 臺灣), 09/13/2019 09:25:24
1F:推 PythonScript: 感謝詳盡的回覆 會好好查這些說明的內容 09/13 09:38







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP