BOOLAN C++ 下1

1.導讀

2.Conversion function

3.non-explicit-one-argument ctor

4.point-link classes

5.function-like classes

6.namespace 經驗談

7.class template 類模板

8.function template 函數模板

9.member template 成員模板

10.specialization 模板特化

11.模板偏特化

12.模板模板參數

13.關于C++標準庫

14.三個主題

15.Reference

1.Conversion Function轉換函數

class Fraction{

public:

operator double() const {//轉換不可能改變類里的成員,通常加上const

return (double)(m_numerator / m_denominator);

}//把Fraction對象轉換成double類型,double()不可有參數,返回類型不用寫

private:

int?m_numerator;

int?m_denominator;

};

Fraction f(3,5);

double d=4+f;//調用operator double()將f轉為0.6

2.non-explict it one arguement construct

//可以把別的東西轉換為這種東西

class Fraction{

public:

Fraction(int num,int den=1):m_numerator(num),m_denominator(den) { ?}

operator double const {

return (double)(m_numerator / m_denominator);

}

Fraction operator+(constFraction& f) {

return

Fraction(...);

private:

int?m_numerator;

int?m_denominator;

};

Fraction f(3,5);

Fractiond2=f+4;//調用non_explict ctor將4轉為Fraction,然后調用operator+

template

calss?vector//模板的先特化,容器里的每個元素都是ool值

{

public:

typedef?__bit_reference?reference;

protected:

reference?operator[](size?type?n){//代表本來真正傳回來的東西

return?*(begin()?+diffenece_type(n));

}

struct?__bit_reference

{

unsigned?int*?p;

unsigned?int?mask;

...

public:

operator?bool()?const?{?return?!(!(*p?*?mask));}

};

3.pointer-like classes,

template

class?shared_ptr{

public:

T&?operator*()?const

{

return?*px;

}

T*?operator->()?const{

return?px;

}

shared_ptr(T*?p):px(p)?{?}

private:

T*?px;//指向T的指針,什么類型都接受

long*?pn;

};

lass?Foo{

...

void?method(void)?{...}

};

shared_ptr?sp(new?Foo);

Foo?f(*sp);

sp->method();//調用method()

px->method();//通過這個對象調用這個函數

箭頭符號有一個特殊的行為:作用下去得到的結果,這個箭頭符號會繼續作用下去

智能指針里頭一定帶著一個一般的指針,而智能指針一定要帶*和->符號

point-class這種類型

4迭代器

主要用來遍歷容器

template

struct?_list_iterator//鏈表的迭代器

{

typedef?_list_iterator?self;

typedef?Ptr?pointrt;

typedef?Ref?reference;

typedef?_list_node*?linx_type;//指向結點的指針

link_type?node;

bool?operator?==?(const?self&?x)?const?{return?node?==?x.node;}

bool?operator?!=?(const?self&?x)?const?{return?node?!=?x.node;}

reference?operator*()?const?{return?(*node}.data;}

pointer?operator->?const?{return?&(operator*());}

self&?operator++()?{node?=?(link_type)((*node).next);return?*this;}

self?operator++(int)?{self?tmp?=?*this;?++*this;?return?tmp;}

self&?operator--()?{node?=?(link_type)((*node).prev;return?*this;}

self?operator--(int)?{self?tmp?=?*this;?--*this;?return?tmp;}

};

5?Function - like class

template

struct?identity : public unart_function{

const?T&?operator()(const?T&?x)?const?{?return?x;}

};

template

struct?selectst{//取出第一個

const?typename?Pair::first_type&?operator()?(const?Pair&?x)?const

{

return?x.first;

}

};

template

Struct?select2nd : publicunart_function{//取出第二個

const?typename?Pair::second_type&?operator()(const?Pair&?x)?const

{

return?x.second;

}

};

template

struct?pair: publicunart_function{

T1?first;

T2?second;

pair()?:?first(T1()),second(T2())?{}

pair(const?T1&?a,const?T2&?b):first(a),second(b)?{?}

};

6.class template類模板和fumction template函數模板

template//復數的類模板

class?complex{

public:

complex(T?r=0,T?i=0):re(r),im(i)?{}

complex?&?operator?+=?(const?complex&);

T?real()?const?{return?re;}

T?imag()?const?{return?im;}

private:

T?re,im;

friend?complex&?__doapl(complex*,const?complex&);

};

{

complex?c1(2.5,1.5);

complex?c2(2,6);

}

函數模板:

class?stone{

public:

stone(int?w,int?h,int?we):_w(w),_h(h),_weight(we)?{}

bool?operator<<(const?stone&?rhs)?const?{

return?_weight?<?rhs._weight;

}

private:

int?_w,_h,_weight;

};

template

inline const T& min(const T& a, const T& b)

{ ?return b;}

函數模板在使用的時候不必指明type,能夠通過調用時傳遞的實參推出來類型

member template成員模板

template

struct?pair{

typedef?T1?first_type;

typedef?T2?second_type;

T1?first;

T2?second;

pair():first(T1()),second(T2())?{}

pair(const?T1?&a,const?T2?&b)

:first(a),second(b)?{}

template? ?//成員模板

pair(const?pait?&p)//T1和T2類型確定了以后,U1和U2也能進行確定

:first(p.first),second(p.second)?{}

}

7.模板特化specialization

Template

struct?hash ();

template<>

struct?hash{

size_t?operator()?(char?x)?const?{return?x;}//重載

};

template<>

struct?hash{

size_t?operator()?(int?x)?const?{return?x;}

};

template<>

struct?hash{

size_t?operator()?(long?x)?const?{return?x;}

};

作者:孫浩_9bfd

鏈接:http://www.lxweimin.com/p/5f845320f773

來源:簡書

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容