effective c 閱讀條款之六

2021-06-08 00:53:40 字數 2011 閱讀 2347

還是自願管理的東西:上次說的是關於raii class的一些知識,這裡補充一下感受,對於auto_ptr<>這個的操作來說

主要的物件還是動態的非陣列類的堆的物件,對於tr1::shared_ptr<>來說的話,操作的物件可以是其他的。下面說本

次的一些的收穫:

1.對於raii class的複製函式的處理,書上說的是對於這類物件的複製會造成不合理,然後書上提出了四種方法,個人

任務比較有價值的是前兩個,後面兩個我基本上是看了就忘,看著就想睡覺的感覺,第乙個建議處理方法就是:禁止複製

這個方法很霸氣,處理也很簡單,在raii class的中把複製函式宣告為私有的就可以了。主要的是第二種方法:使用引用

計數,作者使用tr1::shared_ptr<>作為例子來進行解釋,主要的原因是auto_ptr本身具有侷限性,一是操作物件的侷限性,

二是它基本上沒有引用計數的功能,複製的話就刪除原來的右運算元。但是tr1::shared_ptr<>就不一樣了,具有引用計數的

的功能,有時候有的人會問,假如我在這個計數的是減少到0的時候希望的不是把物件刪除,我希望有其他的操作呢?(tr1::shared_ptr

在引用計數為0的時候就是刪除物件的操作)。這裡tr1::shared_ptr<>比較人性化的一點就是你可以自定義它的刪除器(刪除操作)

作者引用的例子如下:

class lock

~lock() };

//下面是使用tr1::shared_ptr<>的操作

class lock

};

2.對於底層原始資源的引用//就是上面的那個get()的操作

我們知道我們把乙個資源封裝到raii class中去,為的是這個資源可以在不呼叫的時候可以不用我們廢心手動的刪除掉,class可以自動的

呼叫析構函式來解決這個事情。但是有的時候在某些操作的時候我們是很需要底層的原始資源的,這個時候該怎麼辦呢?有兩種方法,乙個

是不用我們動手的,對於auto_ptr和tr1::shared_ptr自帶的具有顯式和隱式的這種操作的,其次的第二種方法就需要我們動手自己去操作了

下面來說第一種方法:第一種方法所提供的都是這個類自帶的一些操作,對於raii class :auto_ptr和tr1::shared_ptr來說可以對他們的物件

呼叫get()函式就可以顯式的獲取指向原來底層資源的最初是的指標(的復件)。隱式的方法就是,這些類還可以使用operator->和operator *的

操作,對raii class物件使用者兩個操作的話可以獲取原始資源。比如原始資源class中包含有某乙個元素,那麼可以通過raii class的物件進行這個操作,

直接的呼叫原始class物件中的元素。

第二種方法就是自我呼叫,都用**來展示,首先是顯式的:

fonthandle get();

void releasefont(fonthandle f);

class font

~font()

};//上面是自己定義的乙個raii class下面就是自己定義的顯式的獲取函式

class font

};

再是隱式的:

//對於隱式定義的轉換就是可以使用

class font

//只要呼叫的是fonthandle的物件的時候就可以使用了

};//但是有乙個不好的地方就是上面的話隱式的呼叫在用到fonthandle物件的時候就隱式轉換,不好控制,但是簡潔,一般還是選擇顯式的,至少我是這麼告訴自己的

3.new和delete要對應使用:記住就可以具體沒什麼細節,只有乙個關於作者舉的例子還是說下,以後好複習,小細節

typedef std::string a[5]

這裡的話把string換了a[5]這個陣列了,那麼

string *p=new a;//new a 等價於new string [5].a是乙個陣列,五元的陣列,每乙個中是乙個string

那麼delete的時候就是delete p;

Effective C 經驗條款

高效c 4 必須返回物件時,別妄想返回其reference 這句話什麼意思呢?就是在乙個函式內,如果你需要這個函式返回乙個新的物件,那麼這個函式的返回值型別就不要定義成引用型別。就直接返回這個類型別。首先,我們知道在函式傳遞引數時,傳遞引用的好處,尤其是對那麼比較大的型別,但是對於內建型別和stl的...

effective c 條款總結

條款1 盡量用const 和inline 而不用 define 條款2 盡量用而不用 條款3 盡量用new delete 而不用malloc free 條款4 盡量使用c 風格注釋 條款5 對應的new和delete 都要採用相同的形式 條款6 析構函式裡對指標成員呼叫delete條款 條款7 預先...

Effective C 經驗條款

高效c 模板與泛型程式設計 在c 中模板體現的是編譯期多型,virtual體現的是執行期多型。關於typename的雙重含義 在宣告template引數時,不論使用keywordclass或typename,意義全然同樣。可是c 並不總是把class和typename視為等價。有時候必須使用type...