亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++Primer第五版 第十三章習題答案(21~30)

2019-11-06 06:17:27
字體:
來源:轉載
供稿:網友

21:知識點:判斷一個類是否需要拷貝控制函數成員,首先判斷其是否需要自定義版本的析構函數,如果需要,則拷貝控制成員函數都需要。由于這兩個類中的指針為智能指針,可以自動控制內存的釋放,所以使用類的合成析構函數即可。另外類默認的拷貝控制成員對于智能指針的拷貝也不需要自定義版本來修改,所以全部定義為 =default 即可

22:知識點1:管理類外資源的類必須定義拷貝控制成員

知識點2:為了定義拷貝控制成員,我們可以定義拷貝操作,使得類的行為看起來像是一個值或者一個指針

知識點3:類的行為像一個值,拷貝發生時,副本和原對象是完全獨立的,改變副本不會對原對象產生影響

知識點4:類的行為像一個指針,拷貝發生時,副本和原對象共用底層數據,改變副本也會改變原對象

知識點5:標準庫容器和string類就是像值的類,shared_ptr類就是像指針的類,IO類和unique_ptr不允許拷貝和賦值,所以都不是

class Hasptr{public:	Hasptr();//默認構造函數	//拷貝構造函數,完成string 指針指向內容的拷貝和i值的拷貝	Hasptr(const Hasptr& p):ps(new string(*p.ps)),i(p.i){}	//拷貝賦值運算符	Hasptr& Operator= (const Hasptr& p)	{		auto new_ps = new string(p.ps);		delete ps;		ps = new_ps;		return *this;	}	//析構函數	~Hasptr(){delete ps;}PRivate:	string *ps;	int i;};

23:知識點1:類值版本,類的構造函數需要可能需要動態分配其成員的副本

知識點2:類值版本,類的拷貝賦值運算符相當于結合了構造函數和析構函數的操作,首先銷毀左側運算對象的資源,再從右側運算符對象拷貝資源,注意順序

知識點3:由于有上述的順序存在,所以我們必須保證這樣的拷貝賦值運算符是正確的:首先將右側運算對象拷貝到一個臨時的對象中,再銷毀左側的運算對象的現有成員,之后將臨時對象中的數據成員拷貝至左側對象中(防范自賦值的情況發生—首先就銷毀了自身的成員,再進行拷貝自身則會訪問到已經釋放的內存中)

見22題,編寫時忘了一個析構函數,ps在構造函數中是動態分配的內存,所以需要進行delete

24:未定義析構函數,ps在使用結束后不會被合成版本的析構函數釋放,造成內存泄漏。未定義拷貝構造函數,使用自定義版本的拷貝構造函數,對于ps的拷貝就會是指針本身的拷貝。

25:動態分配的內存由shared_ptr管理,析構函數之后會自動判斷進行釋放,所以不需要自定義版本的析構函數。

26:知識點1:定義行為像指針的類,在不想使用shared_ptr的情況下我們可以使用引用計數來確定是否釋放內存

知識點2:每個構造函數(拷貝構造函數除外)都創建一個引用計數,記錄對象的共享狀態,第一次被新建時,計數為1

知識點3:析構函數遞減引用計數,拷貝賦值運算符遞增右側對象的引用計數,遞減左側的,當左側的引用計數為0時,拷貝賦值運算符就必須銷毀狀態

知識點4:計數器不能直接作為類對象的成員,否則在拷貝中,會出現歧義,我們可以將計數器保存在動態內存中,只定義一個指向計數器的指針,這樣拷貝或者賦值時,我們拷貝該指針,副本和原對象指向同樣的計數器

class Hasptr1{public:	//構造函數,初始化相關成員	Hasptr1(const string& s = string()):ps(new string(s)),i(0),use(new size_t(1)){}	//拷貝構造函數,將引用計數也拷貝過來,并且遞增引用計數	Hasptr1(const Hasptr1& p):ps(p.ps),i(p.i),use(p.use){++*use;}	//拷貝賦值運算符	Hasptr1& operator= (const Hasptr1& p1)	{		++*p1.use;//首先遞增右側運算符對象的引用計數		if (--*use == 0)//遞減本對象的引用計數,若沒有其他用戶,則釋放本對象的成員		{			delete ps;			delete use;		}		ps = p1.ps;//進行拷貝		use = p1.use;		i = p1.i;		return *this;	}	//析構函數	~Hasptr1()	{		if (*use == 0)//引用計數變為0,說明已經沒有對象再需要這塊內存,進行釋放內存操作		{			delete ps;			delete use;		}	}private:	//定義為指針,是我們想將該string對象保存在動態內存中	string *ps;	size_t *use;//將計數器的引用保存	int i;};

28:(a)類似于27題   (b)只有一個指針成員,參照27題

29:知識點1:如果一個類定義了自己的swap,那么算法將利用類自己的版本(重排順序等算法)

知識點2:自定義版本的swap存在的必要性:我們不希望進行新的內存分配,只希望將其指針進行拷貝賦值(交換的本質),省去不必要的內存分配,將函數定義為friend,以便訪問private成員

知識點3:相對于拷貝控制成員,swap并不是不要的,但是對于那些分配了資源的類,定義swap可能是一種很重要的優化手段

知識點4:swap函數自定義版本與std中版本的重合問題:對于swap函數,其調用應該都是不加限定的,若加std::swap則調用的是標準庫的版本,而標準庫的版本在一定程度上是為了那些內置類型沒有自定義版本的swap而準備的,若一個類有其自定義版本的swap函數,則我們就不應該使用std版本的。所以我們只要在前加上using std::swap聲明,即可,在使用中,若有類特定的swap,其匹配程度則會優于std中的版本(616頁有詳解)

知識點5:在賦值運算符中使用swap,以傳值的方式傳入新對象,再進行拷貝賦值,在一定程度上會比較安全

見知識點4,因為其調用到最后使用的是std中的swap,不存在循環

30:

class Hasptr{	friend void swap(Hasptr&,Hasptr&);public:	Hasptr();//默認構造函數	//拷貝構造函數,完成string 指針指向內容的拷貝和i值的拷貝	Hasptr(const Hasptr& p):ps(new string(*p.ps)),i(p.i){}	//拷貝賦值運算符	Hasptr& operator= (const Hasptr& p)	{		auto new_ps = new string(*p.ps);		delete ps;		ps = new_ps;		return *this;	}	//析構函數	~Hasptr(){delete ps;}private:	string *ps;	int i;};inline void swap(Hasptr& a,Hasptr& b){	using std::swap;	swap(a.ps,b.ps);	std::swap(a.i,b.i);	cout<<"123";}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一综合天堂另类专| 国产一区二区三区在线看| 日韩欧美中文字幕在线观看| 亚洲精品自拍视频| 欧美日韩国产精品一区二区三区四区| 午夜精品久久久久久久久久久久| 国产精品日韩欧美综合| 日韩欧美在线观看| 久久精品国产成人| 国产丝袜一区二区三区| 中文字幕亚洲无线码在线一区| 久久视频在线播放| 国产高清视频一区三区| 久久偷看各类女兵18女厕嘘嘘| 亚洲成年网站在线观看| 日韩免费观看av| 日韩电影中文字幕在线观看| 日韩中文娱乐网| 91中文字幕在线观看| 91手机视频在线观看| 夜夜嗨av一区二区三区四区| 欧美一区二区三区精品电影| 尤物yw午夜国产精品视频明星| 亚洲国产小视频在线观看| 欧美日韩国产一区二区三区| 久久影院在线观看| 欧美激情视频一区二区三区不卡| 91av在线网站| 亚洲国产高清福利视频| 久久精品国产99国产精品澳门| 精品女同一区二区三区在线播放| 久久香蕉频线观| 国产这里只有精品| 久久99国产精品自在自在app| 亚洲一区二区三区毛片| 亚洲另类图片色| 国产精品免费视频久久久| 在线免费观看羞羞视频一区二区| 91精品国产乱码久久久久久蜜臀| 亚洲精品视频播放| 国产精品国产自产拍高清av水多| 日韩欧美国产激情| 美女啪啪无遮挡免费久久网站| 国产精品成人免费电影| 国产极品jizzhd欧美| 亚洲国产欧美在线成人app| 亚洲韩国青草视频| 欧美亚洲日本黄色| 亚洲精品一区二区久| 亚洲午夜激情免费视频| 日韩在线资源网| 国内精品伊人久久| 亚洲高清久久网| 日韩av在线一区二区| 亚洲天堂av图片| 国产一区二区久久精品| 日韩视频一区在线| 在线日韩欧美视频| 国产精品一区二区三区在线播放| 欧美寡妇偷汉性猛交| 亚洲色无码播放| 亚洲成av人乱码色午夜| 欧美日韩亚洲激情| 日韩美女在线看| 中文字幕自拍vr一区二区三区| 久久久精品免费| 国产精品久久久久久久久久| 国产在线精品播放| 久久人人爽人人爽人人片av高清| 国产精品视频内| 性欧美长视频免费观看不卡| 国产精品精品久久久| 66m—66摸成人免费视频| 久久亚洲成人精品| 亚洲一区美女视频在线观看免费| 日韩欧美一区二区三区久久| 5278欧美一区二区三区| 亚洲一区二区三区777| 91国语精品自产拍在线观看性色| 久久夜色精品国产欧美乱| 亚洲成人aaa| 亚洲天堂av图片| 久久精品久久久久久国产 免费| 97视频在线播放| 亚洲女人天堂视频| 亚洲高清免费观看高清完整版| 色诱女教师一区二区三区| 欧美久久久精品| 亚洲欧洲在线免费| 亚洲成色777777在线观看影院| 亚洲一区二区三区视频| 欧美性猛交xxxx| 色先锋久久影院av| 日av在线播放中文不卡| 亚洲激情 国产| 国产xxx69麻豆国语对白| 午夜精品久久久久久久99黑人| 久久中文字幕一区| 国产欧美日韩综合精品| 国产精品视频内| 欧美最猛性xxxxx(亚洲精品)| 国产精品视频不卡| 91色视频在线导航| 国产精品一区二区三区久久久| 久久久久久久97| 国产欧美日韩精品丝袜高跟鞋| 欧美激情中文字幕乱码免费| 亚洲欧美国产高清va在线播| 美女av一区二区| 亚洲第一精品夜夜躁人人爽| 欧美二区乱c黑人| 成人国产精品色哟哟| 亚洲精品mp4| 91亚洲精品视频| 91精品国产成人www| 亚洲最新中文字幕| 国产精品热视频| 亚洲欧美国产高清va在线播| 日韩极品精品视频免费观看| 亚洲激情中文字幕| 伊人亚洲福利一区二区三区| 自拍偷拍免费精品| 精品自在线视频| 成人网欧美在线视频| 亚洲精品中文字幕有码专区| 欧美激情视频在线免费观看 欧美视频免费一| 欧美大片在线影院| 精品小视频在线| 日韩综合中文字幕| 欧美视频在线观看 亚洲欧| 成人黄色大片在线免费观看| y97精品国产97久久久久久| 欧美一级bbbbb性bbbb喷潮片| 欧美视频中文在线看| 国产高清在线不卡| 91人成网站www| 欧美色xxxx| 成人国产在线视频| 国产亚洲激情视频在线| 国产精品91久久久| 国产精品美女呻吟| 国内精品模特av私拍在线观看| 狠狠躁18三区二区一区| 亚洲人成绝费网站色www| 亚洲国产天堂久久综合| 欧美精品在线第一页| 日韩美女福利视频| 97香蕉超级碰碰久久免费的优势| 欧美乱人伦中文字幕在线| 成人激情电影一区二区| 精品国内亚洲在观看18黄| 日韩亚洲欧美中文在线| 亚洲福利在线播放| 亚洲欧美中文日韩在线v日本| 欧美一区二区三区……| 欧美国产第一页| 国产在线精品一区免费香蕉| 亚洲一区精品电影| 久久久久久噜噜噜久久久精品| 91成人福利在线| 亚洲第一精品久久忘忧草社区| 92看片淫黄大片欧美看国产片| 午夜精品一区二区三区视频免费看| 午夜精品久久久99热福利|