iT邦幫忙

2025 iThome 鐵人賽

DAY 29
1
Software Development

30 天 Effective C++ 大挑戰!!系列 第 29

[Day 29] 綜合大會考!! —— 期終篇

  • 分享至 

  • xImage
  •  

又到了博君一笑的綜合大會考時間!這次的範圍從第六章開始,因此有很多「類別繼承」相關的題目。完賽倒數兩天,和 Yoyo 一起複習多個知識點吧。

Q1. 在使用公共繼承時必須確保符合 "______" 關係,因為所有基底類別適用的操作也必須適用於衍生類別。

公共繼承表示衍生類別是基底類別的一種,因此基底類別的所有功能和特性都應該對其適用。這種 "is-a" 繼承關係確保了程式設計的正確性和一致性。

「繼承」不僅是為了重複利用基類的功能,更是為了表示層次結構中的正確語義。如果不保證這種 "is-a" 的語義關係,則可能會破壞物件的邏輯一致性,導致程式在設計和使用上產生問題。

Q2. 若基底類別的名稱被隱藏,可使用 ______ 宣告或代理函數來使隱藏的名稱重新可見。

在公共繼承中,隱藏基底類別的名稱可能會導致意外的行為。使用 using 宣告或代理函數能讓衍生類別同時存取基底類別和自身的成員,避免命名衝突。

當衍生類別中的成員函數與基底類別的名稱衝突時,基底類別的函數名稱會被隱藏無法直接存取,這可能帶來不可預期的行為。除了 using 宣告之外,可以使用代理函數進行間接調用

Q3. 在模板中,若要存取模板化基類的名稱,可使用 "______" 前綴、使用宣告或明確的基類限定名稱來完成。

由於模板基底類別的型態依賴於模板參數,編譯器可能無法解析其成員。使用 this-> 可以清楚告知編譯器該成員屬於該類別。

在模板衍生類別中,基底類別成員可能依賴模板參數,編譯器不一定能自動識別。解決方法有三種。

  • this->member顯式指出來源的基底類別。
  • using Base<T>::member:將基類成員引入衍生類別的作用域。
  • Base<T>::member:用完整限定名稱存取。

Q4. 模板元編程的主要優勢之一是可以將工作從運行時移至 ______,從而提高運行時性能並使錯誤更早被檢測。

模板元編程允許在編譯期間生成自訂程式碼,這有效地減少了運行時資源的消耗並提高了程式的效率。

TMP 是一種使用模板機制在編譯期間生成程式碼的技巧,用以提前執行類似邏輯判斷和計算的操作。例如根據型態選擇特定的程式碼片段,從而優化算法的性能或避免不適合的型態被使用。

這不僅提高了程式的運行效率,也使得型態相關的錯誤更早暴露於編譯期間,而非在運行期間才被檢測到。因而通常用於構建高效、抽象程度高且靈活性強的程式碼,例如設計策略模式或型態特徵類別。

Q5. 在撰寫 placement operator new 時,必須確保同時撰寫對應的 ______,否則可能導致程式發生記憶體洩漏。

自訂的 placement new 配合 delete 可確保正確釋放記憶體。忽略撰寫配套的 delete 可能導致隱性且難以偵測的記憶體問題。

當需要在指定的記憶體位置上構造物件時,placement new 是常用的工具。然而若未提供對應的 placement operator delete,即使物件超出作用域記憶體也不會被正確釋放。撰寫對應的 operator delete 可以確保正確釋放指向指定位置的物件所佔用的記憶體。

在定義自訂的 placement new 和 delete 時,要避免覆蓋預設版本,以免發生意外衝突。

Q6. 若記憶體分配請求無法被滿足,可使用 ______ 設定一個函數來處理此情況。

通過 set_new_handler,可指定當分配記憶體失敗時要執行的邏輯,從而避免非受控的行為。

C++ 的 set_new_handler 函數允許程式設計者在記憶體分配失敗時執行特定的邏輯,例如嘗試釋放資源、記錄錯誤訊息或觸發其他動作。

使用 set_new_handler 不會改變 operator new 的行為,它只用於擴展處理失敗的情境。當記憶體不足時,系統預設可能直接拋出 std::bad_alloc;但通過設定新處理函數,可以在拋出異常前執行額外邏輯。這在需要建立穩定的錯誤處理框架或應用中試圖恢復系統時尤為重要。


上一篇
[Day 28] 中場休息 Q&A小測驗!!
下一篇
[Day 30] 完賽感言
系列文
30 天 Effective C++ 大挑戰!!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言