通常技術性的書籍是不會寫書摘的,頂多也是寫感想,不過這是借的,而且真的學到很多,記下一些資料之後會更好查。
1.extern 的用法仍然困惑著我。
在標頭檔,宣告如下:
const vector<int>* (*seq_array[seq_cnt])(int);
失敗因為被當成定義,物件的定義必須至於本文檔。
//ok,以下是宣告。
extern const vector<int>* (*seq_array[seq_cnt])(int);
2.insertion adapters
back_inserter()會以容器的push_back()函式取代assignment運算子。vector適用。
vector<int> result_vec;
unique_copy(ivec.begin(),ivec.end(),back_inserter(result_vec));
inserter()會以容器的insert()函式取代assignment運算子。接受兩個運算子,一個是容器,一個是插入點的interator。
vector<sting> result_vec;
unique_copy(svec.begin(),svec.end(),inserter(result_vec,result_vec.end()));
front_inseter()會以容器的push_front()函式取代assignment運算子。適用於list 和deque:
list<int> ilist_clone;
copy(ilist.begin(),ilist.end(),front_inseter(ilist_clone));
3.Member initialization list主要在將參數傳給member class object的constructer。如下例:_name直接初始化,對於需直接初始化且無設定值函式的特殊物件,有特殊的功用。另有效率考量。
MemIniList::MemIniList(int len, int bp)::_name(nameobject){}
或者在template編程
template <typename valType>
inline BTnode<valType>::BTnode(const valType &val):_val(val)
//將valType視為class型別,用assignment可能失敗
{
_cnt=1; _lchild=_rchild=0;
}
4.利用dynamic_cast檢驗轉型是否成功。失敗回傳0
if(Fibonacci *pi = dynamic_cast<Finboncacci*>(ps))
pi->gen_elems(64);
5.mutable可讓const物件中的值被設定。
6.BTnode *& prev,reference to pointer修改傳遞過的指標指的位置的值。
7.以(...)補抓任何異常,
catch(...)
{}
8.如果要壓抑不讓bad_alloc異常不被擲出,
ptext = new (nothrow) vector<string>;
new失敗會回傳0,任何人使用ptext要先檢查。
留言