讀書筆記_Effective_C++_條款十九:設計class猶如設計type

?

這里初看到”class”和”type”,感覺他們是說的是同一樣東西,但仔細讀了一下,兩者在文中還是有區別的。class側重于自定義的類,而type側重于系統預定義的類(像int、double、string、vector)。設計好的class,使之像設計type一樣,就是說要使自己設計的類像系統預定義的類那樣好用,這對設計思想提出了較高的要求。

要設計高效的class,需要回答以下的問題:

1. 對象如何去創建和銷毀?

這是構造函數和析構函數的問題,當然如果想要有堆分配方式,還需要重載new、new[]、delete和delete[]運算符;

?

2. 對象初始化與對象的賦值應該有什么樣的差別?

初始化是構造函數和拷貝構造函數的事(這時候對象還沒有產生),但對象的賦值卻不同,因為此時等號左邊的對象已經存在了。

?

3. 新type如果被pass-by-value意味著什么?

會調用相應的拷貝構造函數,要注意是否需要一個深拷貝。

?

4. 什么是新type的合法值?

要對對象的合法值進行限定,通常在構造函數中就對成員變量的范圍給出限定,警惕不安全的輸入值!

?

5. 你的新type需要配合某個繼承圖系嗎?

就是判斷自己設計的class是否需要繼承或被繼承,是基類還是派生類。如果是基類的話,要注意是否允許這個基類生成對象(是否需要利用純虛函數設計成抽象類),以及要將析構函數前面加上virtual。

?

6. 新type需要什么樣的轉換?

主要是針對隱式轉換,operator OtherType() const,但通常情況下隱式轉換也意味著隱患,所以設計時要謹慎。另外,構造函數中也要當心,如果不想讓隱式構造發生,就要在前面加上explicit關鍵字。舉個例子:

 1 class A
 2 
 3 {
 4 
 5 private:
 6 
 7          int a;
 8 
 9 public:
10 
11          A(int b):a(b){}
12 
13 };
14 
15 void fun(A obj);

若調用fun(3),則編譯器也能接受,因為編譯器自動作了fun(A(3))的處理,這就是隱式構造。而如果用戶自己寫fun(A(3)),這是顯式構造。當A的構造函數前有explicit時,fun(3)的調用將通不過編譯器。通常情況下,隱式轉換是安全的。

?

7. 什么樣的操作符和函數對此新type而言是合理的?

就是設計什么樣的成員函數,以及重載哪些運算符。

?

8. 什么樣的標準函數應該駁回?

是說哪些函數對外公開,哪些函數對內使用,這就是private,public和protected的功能啦,protected只有在有繼承關系的類中使用才能發揮它真正的力量,普通的類用private和public就足夠了。

?

9. 誰該取用新type成員?

與上面一條類似,就是類的封裝性問題,一些而言,成員變量都應該是private的,而在public函數里面提供對這些成員變量的訪問get和set函數。如果需要的話,可以使用友元,但友元也要慎用,因為有些編譯器對之支持的不是很好,另一方面,友元成為破壞封裝性的特例,會帶來安全的隱患。

?

10. 什么是新type的未聲明接口?

這個不大明白意思,先放在這里……

?

11. 你的新type有多么一般化?

這牽涉到泛型編程了,就是模板的概念,這是C++比C要方便的多的多的地方——它將需要的類型交給編譯器自動生成。

?

12. 你真的需要一個新type嗎?

其實我覺得應該把這個問題放在第一個,因為設計最初首先要問的就是這個問題,如果都沒有必要設計了,還需要回答前十一個問題嗎?

?

最后總結一下:

class的設計就是type的設計,在設計之前先要把上述12個問題過一遍,這樣可以有把握設計一個成功的類。

轉載于:https://www.cnblogs.com/jerry19880126/archive/2013/06/01/3111908.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378306.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【TensorFlow學習筆記:神經網絡優化(6講)】

目錄【1】NN復雜度【2】指數衰減學習率【3】激活函數優秀激活函數所具有的特點常見的激活函數對于初學者的建議【4】損失函數【5】緩解過擬合——正則化【6】參數優化器【1】SGD【2】SGDM(SGD基礎上增加了一階動量)【3】Adagrade(SGD基礎上增加了二階動量)【4】RMSProp(SGD基礎…

kotlin 構造函數_Kotlin程序| 主要構造函數示例

kotlin 構造函數主要建設者 (Primary Constructor) A Kotlin class have Primary constructor and one or more Secondary constructor. Kotlin類具有Primary構造函數和一個或多個Secondary構造函數。 In Kotlin, Primary Constructor is the Part of Class Header. 在Kotlin中…

把SQL Server 錯誤日志導出為EXCEL 并發送到指定的ftp 或者 共享盤

把SQL Server 錯誤日志導出為EXCEL 并發送到指定的ftp 或者 共享盤 /* 2005版本 和2000 版本 sql server 錯誤日志結果不同。 下面是 適用于 SQL2000的 其中加入了 自己編寫的一個ftp小程序 用來上傳 相關日志狀況*/IF object_id(tempdb..#error_log) IS NOT NULLD…

c語言軟件幻化,python字符串處理

字符串字符串:不可變有序序列,在python可使用 "abc" , """abc""" ,abc 的形式表示,屬于一種字面常量,python3中字符均屬于Unicode編碼。字符串可以被迭代,遍歷,切…

第十章 開箱即用

第十章 開箱即用 “開箱即用”(batteries included)最初是由Frank Stajano提出的,指的是Python豐富的標準庫。 模塊 使用import將函數從外部模塊導入到程序中。 import math math.sin(0)#結果為:0.0模塊就是程序 在文件夾中創…

博客換膚

一直以來覺得博客園里的主題不是特別好,很多模版多多少少都有些美中不足,于是今天抽了點時間把主題改改,哈。幸虧博客園支持自定義樣式。 時間有限就先改到這里,今后有時間在進一步完美,呵呵。轉載于:https://www.cnbl…

duration java_Java Duration類| 帶示例的get()方法

duration java持續時間類get()方法 (Duration Class get() method) get() method is available in java.time package. get()方法在java.time包中可用。 get() method is used to return the value for the given unit. get()方法用于返回給定單位的值。 get() method is a non…

Openmv通過串口接收數據、發送數據與stm32通信

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 目錄 參考接線星瞳教程openmv傳送數據STM32解碼程序參考 接線 星瞳教程

c語言尹寶林答案,c程序設計導引 尹寶林

《C程序設計導引》特別適合作為計算機和非計算機專業學生學習高級語言程序設計的教材,也可供計算機等級考試者和其他各類學習者使用參考。17.40定價:44.75(3.89折)/2013-05-01《大學計算機優秀教材系列:C程序設計導引》是一本講解C程序設計的…

從程序員到項目經理(15):項目管理三大目標

項目管理的三大目標即時間、成本和質量,實際是告訴項目經理應重點關注什么因素,項目控制應該做什么工作。三大目標雖然簡單,但如果能將其真正貫徹到自己的行動中,那么對項目計劃制定、過程控制等工作,均能起到引導作用…

第十一章 文件

第十一章 文件 打開文件 當前目錄中有一個名為beyond.txt的文本文件,打開該文件 調用open時,原本可以不指定模式,因為其默認值就是’r’。 import io f open(beyond.txt)文件模式 值描述‘r’讀取模式(默認值)‘w…

iterator與iterable

用Iterator模式實現遍歷集合Iterator模式是用于遍歷集合類的標準訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向客戶端暴露集合的內部結構。例如,如果沒有使用Iterator,遍歷一個數組的方法是使用索引: for(i…

Android中的Touch事件處理流程

1、當觸摸屏幕時,最先執行的是Activity中的 publicbooleandispatchTouchEvent (MotionEvent ev) {if(ev.getAction() MotionEvent. ACTION_DOWN) {onUserInteraction();}if(getWindow().superDispatchTouchEvent(ev)) {returntrue;}returnonTouchEvent(ev);}如果某…

【TensorFlow學習筆記:神經網絡八股】(實現MNIST數據集手寫數字識別分類以及FASHION數據集衣褲識別分類)

課程來源:人工智能實踐:Tensorflow筆記2 文章目錄前言一、搭建網絡八股sequential1.函數介紹2.6步法實現鳶尾花分類二、搭建網絡八股class1.創建自己的神經網絡模板:2.調用自己創建的model對象三、MNIST數據集1.用sequential搭建網絡實現手寫數字識別2.用…

c語言 在執行區域沒有空格,C語言上機操作指導之TurboC.doc

C語言上機操作指導之 -------- Turbo C程序設計是實踐性很強的過程,任何程序都必須在計算機上運行,以檢驗程序的正確與否。因此在學習程序設計中,一定要重視上機實踐環節,通過上機可以加深理解 C語言的有關概念,以鞏固…

java 根據類名示例化類_Java即時類| from()方法與示例

java 根據類名示例化類即時類from()方法 (Instant Class from() method) from() method is available in java.time package. from()方法在java.time包中可用。 from() method is used to return a copy of the Instant from the given TemporalAccessor object. from()方法用于…

第十二章 圖形用戶界面

第十二章 圖形用戶界面 GUI就是包含按鈕、文本框等控件的窗口 Tkinter是事實上的Python標準GUI工具包 創建GUI示例應用程序 初探 導入tkinter import tkinter as tk也可導入這個模塊的所有內容 from tkinter import *要創建GUI,可創建一個將充當主窗口的頂級組…

Sqlserver 2005 配置 數據庫鏡像:數據庫鏡像期間可能出現的故障:鏡像超時機制

數據庫鏡像期間可能出現的故障 SQL Server 2005其他版本更新日期: 2006 年 7 月 17 日 物理故障、操作系統故障或 SQL Server 故障都可能導致數據庫鏡像會話失敗。數據庫鏡像不會定期檢查 Sqlservr.exe 所依賴的組件來驗證組件是在正常運行還是已出現故障。但對于某…

江西理工大學期末試卷c語言,2016年江西理工大學信息工程學院計算機應用技術(加試)之C語言程序設計復試筆試最后押題五套卷...

一、選擇題1. 設有函數定義:( )。A. B. C. D. 答:A則以下對函數sub 的調用語句中,正確的是【解析】函數的參數有兩個,第一個是整型,第二個是字符類型,在調用函數時,實參必須一個是整型&#xff…

第十三章 數據庫支持

第十三章 數據庫支持 本章討論Python數據庫API(一種連接到SQL數據庫的標準化方式),并演示如何使用這個API來執行一些基本的SQL。最后,本章將討論其他一些數據庫技術。 關Python支持的數據庫清單 Python數據庫API 標準數據庫API…