顯示廣告
隱藏 ✕
※ 本文為 xxxx9659.bbs. 轉寄自 ptt.cc 更新時間: 2013-03-30 14:04:16
看板 C_and_CPP
作者 legnaleurc (CA)
標題
 Re: [討論] 有鑑別度的問題??

時間 Tue Jan  8 02:52:46 2013


: 推 xvid:這篇有好心人願意解答嗎?                                   01/08 00:5

我是斗M,快來鞭我 ._./

※ 引述《littleshan (我要加入劍道社!)》之銘言:
: 標題: Re: [討論] 有鑑別度的問題??
: 時間: Mon Jan  7 00:13:59 2013
:
: 隨便想的幾個題目
:
: 1. 若在 class 中定義了 destructor,則通常還需要定義另外兩個 function。
:    為什麼?

copy assignment operator 和 copy constructor

如果有需要自訂解構行為通常也會影響到 copy 語意

不過因為 C++ 夭壽複雜的規則,有時也會有例外

: 2. mutable 這個關鍵字應該用在什麼地方?

被 mutable 修飾的成員即使在 const method 裡也可以被修改

這跟 volitale 一樣是不太常用的 cv 修飾字

用途嘛 ... 有時候你會需要在 const method 重用 non-const 版本

不過我個人是會避開就是了

: 3. 為什麼 C++ 有四種不同的 cast operator?

static_cast: 顯式轉型(e.g.: 大轉小,有號無號 ... etc.)
const_cast: 去掉 CV 修飾字
dynamic_cast: 向下轉型,失敗會是 nullptr
reinterpret_cast: 以上三種以外的情況用這種,但後果要看 compiler
不是不好,很多時候只能這麼轉,像是 function pointer

不同場合用不同的 cast,用 grep 比較好找(?)

: 4. exception 有什麼優點和缺點?

戰文。


...


雖然現在的普世價值觀是 exception > error code,但仍有一票人

不喜歡 C++ exception,像是 Joel 曾寫一篇 blog 批評 C++ exception


優點是它可以把錯誤處理的程式碼分開,較為清晰好讀,也較好維護

缺點是 ... 嗯,只講 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 與單一繼承。
:    允許多重繼承有什麼缺點?

最明顯的問題是可能會出現鑽石狀繼承圖

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:好文1F 01/08 03:08
EdisonX:push2F 01/08 03:09
loveme00835:2. 的話有時會出現在前人介面設計不好時, 為了銜接的3F 01/08 08:30
loveme00835:一時之計
Bencrie:推 ~5F 01/08 08:47
loveme00835:第五題補充 http://ideone.com/HguTi36F 01/08 09:04
loveme00835:6. 可以考慮 pthread_once()
jackylu63:推!8F 01/08 09:36
littleshan:抖M大大,敝公司最近召募RD,有沒有興趣來聊一聊 (無誤9F 01/08 10:10
b98901056:推  最後一句中肯Q^Q  我開始懷疑我是不是m了XDD10F 01/08 10:11
legendmtg:mutable在get funciton還蠻可能用到的....11F 01/08 11:27
legendmtg:如果你的class有用caching....
silveriii:推13F 01/08 12:06
xvid:推!感謝解答14F 01/08 13:25
legnaleurc:@loveme00835 感謝補充,需要虛擬繼承的例子15F 01/08 15:46
legnaleurc:@littleshan 謝謝,不過我還沒畢業 XD
s3748679:打擾 關於第5點內文: "陣列裡的多型指標都不可信"17F 01/08 23:11
s3748679:多型指標都不可信 可以理解 可是在陣列裡不太懂意思
s3748679:能不能給個因為這樣邏輯錯誤的例子 @_@"
s3748679:(補充下意思好了:是指說這樣會導致陣列操作會有意外發生?
s3748679:是說像這種 http://ideone.com/7WYZfl 情況的用法有問題?
legnaleurc:重點是你不知道 a[1] 的位址是不是偏移後的 B *22F 01/08 23:47
legnaleurc:不是多重繼承"或"陣列,是多重繼承"且"陣列的問題
k387259:好文必須推24F 01/09 00:02
VictorTom:推:)25F 01/09 00:15
s3748679:喔喔 以這為例: http://ideone.com/clone/7WYZfl 是指說26F 01/09 00:43
s3748679:這會因為多重繼承的緣故 使得縱使同樣從d轉來的a[0] a[1]
s3748679:也沒辦法確認為同個實體 從而造成陣列應用上的困擾這樣?
s3748679:抱歉.. 網址更正下: http://ideone.com/5BVkto
ibmibmibm:補充:mutable最常用在包含在class內的mutex member30F 01/09 12:28
Ebergies:好好的人為什麼要學 C++ LOL31F 01/09 17:16
ykjiang:Joel 戰的是 Java 的 Exception 吧32F 01/10 13:34
legnaleurc:再回去翻一下他的文章,發現他並不只指 C++33F 01/10 15:13
legnaleurc:感謝指正
siriusu:第一次聽到mutuble @@ 想請問是正當使用的修飾詞 還是應35F 01/11 05:12
siriusu:該避開使用?
legnaleurc:當用則用吧37F 01/12 18:35
siriusu:ok thx :D38F 01/13 00:09

--
※ 看板: xxxx9659 文章推薦值: 0 目前人氣: 0 累積人氣: 81 
guest
x)推文 r)回覆 e)編輯 d)刪除 M)不收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇