Re: [討論] 面試有鑑別度的問題??

看板C_and_CPP作者 (無雙上將)時間11年前 (2013/01/08 06:03), 編輯推噓2(209)
留言11則, 5人參與, 最新討論串5/14 (看更多)
因為要去開會,換個term我會接著戰的 ※ 引述《legnaleurc (CA)》之銘言: : 標題: Re: [討論] 有鑑別度的問題?? : 時間: Tue Jan 8 02:52:46 2013 : : : 推 xvid:這篇有好心人願意解答嗎? 01/08 00:5 : : 我是斗M,快來鞭我 ._./ 首先抖m前輩已經很強大了……我主要就是補充一下 : : ※ 引述《littleshan (我要加入劍道社!)》之銘言: : : 標題: Re: [討論] 有鑑別度的問題?? : : 時間: Mon Jan 7 00:13:59 2013 : : : : 隨便想的幾個題目 : : : : 1. 若在 class 中定義了 destructor,則通常還需要定義另外兩個 function。 : : 為什麼? : : copy assignment operator 和 copy constructor : : 如果有需要自訂解構行為通常也會影響到 copy 語意 : : 不過因為 C++ 夭壽複雜的規則,有時也會有例外 這裡我覺得是常常會有例外才對。想想policies和純interfaces classes。 我想一個較為明顯的提問方式應該是:如果定義了destructor且非virtual…… : : : 2. mutable 這個關鍵字應該用在什麼地方? : : 被 mutable 修飾的成員即使在 const method 裡也可以被修改 : : 這跟 volitale 一樣是不太常用的 cv 修飾字 : : 用途嘛 ... 有時候你會需要在 const method 重用 non-const 版本 給觀眾的補充:IIRC, effective cpp中是用const_cast解決的此問題。 : : 不過我個人是會避開就是了 : : : 3. 為什麼 C++ 有四種不同的 cast operator? : : static_cast: 顯式轉型(e.g.: 大轉小,有號無號 ... etc.) : const_cast: 去掉 CV 修飾字 : dynamic_cast: 向下轉型,失敗會是 nullptr : reinterpret_cast: 以上三種以外的情況用這種,但後果要看 compiler : 不是不好,很多時候只能這麼轉,像是 function pointer 若考慮到問題字面上的意思,cpp是強迫程序員用這種ugly的方式來意識到自己在做什麼 : : 不同場合用不同的 cast,用 grep 比較好找(?) : : : 4. exception 有什麼優點和缺點? : : 戰文。 : : : .... : : : 雖然現在的普世價值觀是 exception > error code,但仍有一票人 : : 不喜歡 C++ exception,像是 Joel 曾寫一篇 blog 批評 C++ exception 個人非常討厭exception in C++。 理由這裡都已經講到了,尤其是異常安全的問題非常讓人頭疼 C++的異常機制缺少finally,實用起來太過危險。 : : : 優點是它可以把錯誤處理的程式碼分開,較為清晰好讀,也較好維護 : : 缺點是 ... 嗯,只講 C++ 好了 : : 1. 你要懂 exception-safety : : 然後你就要知道 RAII : 知道為什麼你不可以在資源回收或 swap 時丟 exception : 以及思考你要採取哪種保證 : : 2. C++ 的 exception 沒有 frame stack 資訊 : : 苦命地開 debugger 吧 : : 3. 過 multithread 會爆炸 : : 你要在 thread 邊界接下來 : : 4. C++ 的 ABI 沒有標準 : : 所以你可能要在 module 邊界接下來轉成 error code : : : 5. C++ 提供多重繼承,但 C# 或 Java 都採用 interface 與單一繼承。 : : 允許多重繼承有什麼缺點? 恩,這個解答一下就顯出功力深厚了,Orz.... : : 最明顯的問題是可能會出現鑽石狀繼承圖 : : Java 所有物件都繼承自 Object,要是能多重繼承,鑽石就來了 : : C++ 讓使用者自已解決 : : 好處是設計自由,衍生出如 policy-based design 等手法 : : 但壞處是你要處處小心不要炸了自已的腳,還要記得用 virtual inheritance : : 另外 C++ 很鳥的地方是多重繼承後的指標,在大部分的 compiler 上會有 offset : : 比方說 class C: public A, public B {}; : : C * c = new C; : A * a = c; : B * b = c; : : 指標的值,b 會和 c 不一樣,但是 b == c 是 true : : 這代表什麼,代表存在陣列裡的多型指標都不可信 : : 因為陣列需要計算指標的 offset : : : 6. 為什麼我們要避免使用 global variable? : : Singleton 是 global variable 嗎?為什麼? : : 一個非 const 變數存在的 context 越大,它就越難掌控 : : 你很難一眼看出來哪些程式碼依賴這個變數 : : 還有最重要的 multithreading 同步問題 : : 關於 Singleton,還是戰文 : : 我的看法是,這東西就是包裝精美的全域變數 這個現在應該是共識了 : : 全域變數有的缺點它全都有,只不過它讓你有方法補救 : : 在 C++ 它的重點有二: : : 1. 正確解構順序 : : 一般來說沒什麼難的,但如果你有用到 dll ... : : 2. 在 multithread 環境正確初始化 : : C++ 的 memory model 其實沒考慮到 thread : : 所以如果在進入 multithread 之後才想要初始化 : : 那祝你好運 :) : : : : : : : : : : : : : : : : : : : : : : : 好好的一個人,何苦學 C++? : : -- : 自High筆記(半荒廢) : http://legnaleurc.blogspot.com/ : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 114.32.198.231 : ※ 編輯: legnaleurc 來自: 114.32.198.231 (01/08 03:02) : → diabloevagto:好文 01/08 03:08 : 推 EdisonX:push 01/08 03:09 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 54.240.196.185 ※ 編輯: devilphoenix 來自: 54.240.196.186 (01/08 06:15)

01/08 09:58, , 1F
定義了destructor且非virtual 讓我突然明白了Q_Q
01/08 09:58, 1F

01/08 21:30, , 2F
C++沒有finally是因為有RAII
01/08 21:30, 2F

01/09 02:26, , 3F
加入finally並不與RAII矛盾……
01/09 02:26, 3F

01/09 10:37, , 4F
我想PkmX的意思是,因為有RAII所以不需要finally
01/09 10:37, 4F

01/09 10:38, , 5F
Java和C#物件並不會在離開scope馬上解構
01/09 10:38, 5F

01/09 10:39, , 6F
因此會需要finally
01/09 10:39, 6F

01/09 11:22, , 7F
我明白,但是如果加入finally就可以幫助大量水平一般
01/09 11:22, 7F

01/09 11:22, , 8F
的程序員……
01/09 11:22, 8F

01/09 11:34, , 9F
水平一般的話寫Java會快些喔
01/09 11:34, 9F

01/09 12:19, , 10F
http://ppt.cc/QYVx C++11 Style
01/09 12:19, 10F

01/09 12:30, , 11F
我等著S大大出TCPPPL for c++11呢
01/09 12:30, 11F
文章代碼(AID): #1GwqOaYs (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1GwqOaYs (C_and_CPP)