www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 芯聞號(hào) > 充電吧
[導(dǎo)讀]我最不喜歡循規(guī)循矩,雖然是讓寫筆記,照著老師的ppt抄一遍有什么意思。所以我還是喜歡寫自己的東西。最近我有個(gè)怪癖,愛把所有帶指針的類都改造成使用智能指針來控制資源分配和回收。因?yàn)槲艺J(rèn)為既然是c++11

我最不喜歡循規(guī)循矩,雖然是讓寫筆記,照著老師的ppt抄一遍有什么意思。所以我還是喜歡寫自己的東西。

最近我有個(gè)怪癖,愛把所有帶指針的類都改造成使用智能指針來控制資源分配和回收。因?yàn)槲艺J(rèn)為既然是c++11標(biāo)準(zhǔn)出的應(yīng)該是可以頂替99標(biāo)準(zhǔn),更安全更先進(jìn)的用法,為什么不用呢?結(jié)果在這兩周侯捷老師的c++課上的例子的智能指針改寫上吃了苦頭,也領(lǐng)悟到什么時(shí)候該用智能指針,什么時(shí)候不該用。離提交作業(yè)的日期只剩兩天不到,有空的話我會(huì)將我對(duì)Date類,Rectangle類的改寫也在這里講一下。

我這里目的并不是講解智能指針,所以講的并不細(xì)。

什么是智能指針:

智能指針就是通過模板實(shí)現(xiàn)的對(duì)普通指針的一種封裝,我偏愛用shared_ptr指針。通過引用計(jì)數(shù),來管理自己的引用數(shù)量,當(dāng)計(jì)數(shù)為0時(shí),自動(dòng)釋放內(nèi)存。

什么時(shí)候該用它呢?

本來我有個(gè)A類型的指針:

A?*a?=?new?A();

這樣我還要操心去delete它。假如這行代碼在一個(gè)函數(shù)內(nèi),并且a會(huì)作為該函數(shù)的返回值返回的話(比如第一周的作業(yè)Date類隨機(jī)產(chǎn)生10個(gè)日期返回的函數(shù))那選擇什么時(shí)候delete就很重要了。有的時(shí)候不好抉擇,增加維護(hù)的復(fù)雜程度。

那么這就是智能指針大顯身手的時(shí)候。

shared_ptr?a?=?make_shared();

起到了和剛才那條語句一樣的效果。
假如這個(gè)函數(shù)是

shared_ptr?fun()?{
??shared_ptr?a?=?make_shared();
//?對(duì)a做點(diǎn)什么
?return?a;
}

這樣的話,函數(shù)里定義a,引用計(jì)數(shù)為1,返回a,a的引用計(jì)數(shù)仍為1.而當(dāng)a使用完畢后,到了函數(shù)使用時(shí)所在作用域的結(jié)束位置時(shí)。a的引用計(jì)數(shù)會(huì)-1,此時(shí)為0,自動(dòng)釋放內(nèi)存。不用我們?nèi)斯elete了。

String類不使用shared的模樣

這個(gè)String類是我自己寫的,但跟課程里的只有一點(diǎn)點(diǎn)不一樣。
返回成員的函數(shù)返回類型我設(shè)為const char*,因?yàn)檫@樣的話可以避免使用函數(shù)時(shí)對(duì)成員做出我們不期望的修改。

#ifndef?STRING_H
#define?STRING_H

#include#includeusing?std::ostream;

class?String?{
public:
????String(const?char?*cstr?=?0);
????String(const?String&);
????String?&operator=(const?String&);
????~String();
????const?char*?get()?const;
private:
????char?*m_data;
};

inline
String::String(const?char?*cstr)?{
????if?(cstr)?{
????????m_data?=?new?char[strlen(cstr)?+?1];
????????strcpy(m_data,?cstr);
????}?else?{
????????m_data?=?new?char[1];
????????*m_data?=?'