c++語法4

上一篇繼續(xù)學(xué)習(xí)抽象類、函數(shù)模板

抽象類

c++中的抽象類是通過純虛函數(shù)體現(xiàn)的,凡是含有純虛函數(shù)的類叫做抽象類
純虛函數(shù):是一種特殊的虛函數(shù)魏保,在許多情況下安岂,在基類中不能對(duì)虛函數(shù)給出有意義的實(shí)現(xiàn)涯雅,而把它聲明為純虛函數(shù),它的實(shí)現(xiàn)留給該基類的派生類去做瘸爽。
它的一般格式如下:

class <類名>{
virtual <類型><函數(shù)名>(<參數(shù)表>)=0;
…
};

抽象類是不能直接創(chuàng)建的您访,如果子類沒有實(shí)現(xiàn)所有的純虛函數(shù),則這個(gè)派生類也是抽象類剪决。

#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Human {
private:
    int a;
public:
    virtual void eating(void) = 0;
    virtual void wearing(void) = 0;
    virtual void driving(void) = 0;
    virtual ~Human() { cout<<"~Human()"<<endl; }
    virtual Human* test(void) {cout<<"Human's test"<<endl; return this; }
};
class Englishman : public Human {
public:
    void eating(void) { cout<<"use knife to eat"<<endl; }
    void wearing(void) {cout<<"wear english style"<<endl; }
    void driving(void) {cout<<"drive english car"<<endl; }
    virtual ~Englishman() { cout<<"~Englishman()"<<endl; }
    virtual Englishman* test(void) {cout<<"Englishman's test"<<endl; return this; }
};
class Chinese : public Human {
public:
    void eating(void) { cout<<"use chopsticks to eat"<<endl; }
    void wearing(void) {cout<<"wear chinese style"<<endl; }
    void driving(void) {cout<<"drive chinese car"<<endl; }
    virtual ~Chinese() { cout<<"~Chinese()"<<endl; }
    virtual Chinese* test(void) {cout<<"Chinese's test"<<endl; return this; }
};
int main(int argc, char **argv){
    //Human h;  //抽象類不能直接創(chuàng)建
    Englishman e;
    Chinese c;
    return 0;
}

抽象類主要的作用是進(jìn)行類型隱藏灵汪。構(gòu)造出一個(gè)固定的一組行為的抽象描述,但是這組行為卻能夠有任意個(gè)可能的具體實(shí)現(xiàn)方式柑潦。這個(gè)抽象描述就是抽象類享言,而這一組任意個(gè)可能的具體實(shí)現(xiàn)則表現(xiàn)為所有可能的派生類。

函數(shù)模板

函數(shù)模板不是一個(gè)實(shí)在的函數(shù)渗鬼,編譯器不能為其生成可執(zhí)行代碼览露。定義函數(shù)模板后只是一個(gè)對(duì)函數(shù)功能框架的描述,當(dāng)它具體執(zhí)行時(shí)譬胎,將根據(jù)傳遞的實(shí)際參數(shù)決定其功能差牛。類似java中的泛型命锄。
函數(shù)模板定義的一般形式如下:

template<類型形式參數(shù)表>
返回類型 函數(shù)名(形式參數(shù)表){
... //函數(shù)體
}

使用模板實(shí)現(xiàn)返回2個(gè)數(shù)中大值函數(shù)

#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
template<typename T>
T& mymax(T& a, T& b){
    cout<<__PRETTY_FUNCTION__<<endl;
    return (a < b)? b : a;
}
int main(int argc, char **argv){
    int ia = 1, ib = 2;
    float fa = 1, fb = 2;
    double da = 1, db = 2;
    mymax(ia, ib);
    mymax(fa, fb);
    mymax(da, db);
    return 0;
}

cout<<PRETTY_FUNCTION<<endl;可以打印方法名稱
輸出:

T& mymax(T&, T&) [with T = int]
T& mymax(T&, T&) [with T = float]
T& mymax(T&, T&) [with T = double]
  • 函數(shù)模板的原理:
  1. 函數(shù)模板只是編譯指令,一般寫在頭文件中偏化;
  2. 編譯程序時(shí)脐恩,編譯器根據(jù)函數(shù)的參數(shù)來“推導(dǎo)”模板的參數(shù);然后生成具體的模板函數(shù)
    示例代碼:
    int a; int b; mymax(a, b);
    編譯器根據(jù)函數(shù)參數(shù)a,b推導(dǎo)出模板參數(shù)為int侦讨,所以把模板中的T綁定為int被盈;
    編譯程序時(shí)生成如下函數(shù):
    int& mymax(int& a, int& b){
    return (a<b)?b:a;
    }
    所以在上面的main函數(shù)中有int、float搭伤、double三種類型的模板函數(shù)。
  mymax(ia, ib);
  mymax(fa, fb);
  mymax(da, db);

這三個(gè)的調(diào)用其實(shí)調(diào)用了三個(gè)模板函數(shù)

模板的參數(shù)推導(dǎo)支持的類型轉(zhuǎn)換比較少袜瞬,主要有兩種:

  • const轉(zhuǎn)換 :函數(shù)參數(shù)為非const引用/指針, 它可以隱式轉(zhuǎn)換為const引用/指針
template<typename T>
const T& mymax(const T& a, const T& b){
    cout<<__PRETTY_FUNCTION__<<endl;
    return (a < b)? b : a;
}
int main(int argc, char **argv){
    int ia = 1;
    int ib = 2;
    mymax(ia, ib);
    return 0;
}

推導(dǎo)的結(jié)果:const T& mymax(const T&, const T&) [with T = int]

  • 數(shù)組或函數(shù)指針轉(zhuǎn)換:
    • 1.數(shù)組可以隱式轉(zhuǎn)換為“指向第1個(gè)元素的指針”
    • 2.參數(shù)為“函數(shù)的名字” 時(shí)怜俐,它隱式轉(zhuǎn)換為“函數(shù)指針”
template<typename T>
const T& mymax(const T& a, const T& b){
    cout<<__PRETTY_FUNCTION__<<endl;
    return (a < b)? b : a;
}
template<typename T>
const T* mymax2(const T* a, const T* b){
    cout<<__PRETTY_FUNCTION__<<endl;
    return (a < b)? b : a;
}
template<typename T>
void test_func(T f){
    cout<<__PRETTY_FUNCTION__<<endl;
}
int f1(int a, int b){
    return 0;
}
int main(int argc, char **argv){
    char a[]="ab";
    char b[]="cd";
    mymax(a, b);  /* T=char[3] */
    mymax2(a, b);
    char a2[]="abc";
    char b2[]="cd";
    //mymax(a2, b2);  /* mymax(char[4], char[3]), 無法推導(dǎo)出T: mymax(char& [4], char& [3]), 因?yàn)閮蓚€(gè)參數(shù)類型不一樣 */
    mymax2(a2, b2);   /* mymax2(char[4], char[3]), 推導(dǎo): mymax2(const char *, const char *); */
    test_func(f1);
    test_func(&f1);
    return 0;
}

輸出:

const T& mymax(const T&, const T&) [with T = char [3]]
const T* mymax2(const T*, const T*) [with T = char]
const T* mymax2(const T*, const T*) [with T = char]
void test_func(T) [with T = int (*)(int, int)]
void test_func(T) [with T = int (*)(int, int)]

mymax2模板可以將數(shù)組轉(zhuǎn)換為指針,所以char數(shù)組的長度不同也會(huì)推導(dǎo)出來是 char*,而如果是引用則會(huì)因?yàn)橥茖?dǎo)出char& [4], char& [3]不一樣的類型邓尤,推導(dǎo)失敗拍鲤。
對(duì)于傳入的參數(shù)是函數(shù),不論是函數(shù)名還是引用汞扎,都會(huì)被轉(zhuǎn)為函數(shù)指針季稳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市澈魄,隨后出現(xiàn)的幾起案子景鼠,更是在濱河造成了極大的恐慌,老刑警劉巖痹扇,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铛漓,死亡現(xiàn)場離奇詭異,居然都是意外死亡鲫构,警方通過查閱死者的電腦和手機(jī)浓恶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來结笨,“玉大人包晰,你說我怎么就攤上這事】晃” “怎么了伐憾?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長算途。 經(jīng)常有香客問我塞耕,道長,這世上最難降的妖魔是什么嘴瓤? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任扫外,我火速辦了婚禮莉钙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筛谚。我一直安慰自己磁玉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布驾讲。 她就那樣靜靜地躺著蚊伞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吮铭。 梳的紋絲不亂的頭發(fā)上时迫,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音谓晌,去河邊找鬼掠拳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纸肉,可吹牛的內(nèi)容都是我干的溺欧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼柏肪,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼姐刁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烦味,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤聂使,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谬俄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岩遗,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年凤瘦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宿礁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔬芥,死狀恐怖梆靖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笔诵,我是刑警寧澤返吻,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站乎婿,受9級(jí)特大地震影響测僵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一捍靠、第九天 我趴在偏房一處隱蔽的房頂上張望沐旨。 院中可真熱鬧,春花似錦榨婆、人聲如沸磁携。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谊迄。三九已至,卻和暖如春烟央,著一層夾襖步出監(jiān)牢的瞬間统诺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工疑俭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篙议,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓怠硼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親移怯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子香璃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,517評(píng)論 1 51
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別? C沒有Protection行為...
    阿面a閱讀 7,659評(píng)論 0 10
  • 重新系統(tǒng)學(xué)習(xí)下C++舟误;但是還是少了好多知識(shí)點(diǎn)葡秒;socket;unix嵌溢;stl眯牧;boost等; C++ 教程 | 菜...
    kakukeme閱讀 19,888評(píng)論 0 50
  • 1.面向?qū)ο蟮某绦蛟O(shè)計(jì)思想是什么赖草? 答:把數(shù)據(jù)結(jié)構(gòu)和對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作的方法封裝形成一個(gè)個(gè)的對(duì)象学少。 2.什么是類?...
    少帥yangjie閱讀 5,000評(píng)論 0 14
  • 滴答滴答滴答,時(shí)間在一秒一秒地流逝乎折,有的人空長年紀(jì)不長心智绒疗,有的人卻煉成了“長生不老”的丹藥。就算年紀(jì)再大骂澄,依舊有...
    intatami閱讀 382評(píng)論 2 1