【C++】C++學習筆記之十:類模板眉撵,函數模板及其他

static 與 this 指針

static

當類被多次實例化后帐要,一般數據成員會有多份把敞,而成員函數只有一份,通過this指針確定當前數據成員是在那個對象中被調用榨惠。但是類中的static成員卻不盡相同:

static成員數據

類中的static數據成員奋早,在類中只有一份,可以理解成赠橙,類范圍內的靜態(tài)全局變量耽装。
類中的static數據成員必須在類外定義并初始化,類中聲明期揪。
就像靜態(tài)變量掉奄,類中的static數據成員也只初始化一次,并在整個程序的聲明周期中一直存在凤薛。

static成員函數

類的static成員函數姓建,與普通成員函數不同,它被調用時不會傳遞this指針缤苫,也就是說他沒有對象的概念速兔。
類中的static成員函數,只能使用類中的static數據成員活玲。(因為沒有this指針不能確認那個普通數據成員可以使用)
static成員函數的調用方式有兩種:
1.通過對象調用
2.通過class name調用

class complex{
    private:
        double re, im;
        static int instance_cnt;
    public:
        complex(double _re = 0, double _im = 0) : re(_re), im(_im) {  instance_cnt++; }
        complex(const complex & c):re(c.re), im(c.im) { instance_cnt++; }
        static int get_instance_num(){ return instance_cnt; } //返回當前類共有多少對象
}憨栽;
int complex::instance_cnt = 0;

int main(){
    complex c1(1,2);
    complex c2(c1);
    complex c3 = c2;
    complex *pc = new complex(2,3);
    cout << "complex class has " << complex::get_instance_num() << " objects in total." << endl;//通過類名調用
    delete pc;
    pc = NULL;
    cout << "now the complex class has " << c1.get_instance_num() << " objects left." << endl;//通過類對象調用
}

以上運行結果:

Paste_Image.png

注:static 成員數據在類外定義的時候不需要使用static關鍵字:

Paste_Image.png

this指針

類的成員函數都有一個隱藏的參數——this指針,當數據成員被調用時都會隱式傳入this指針翼虫。但是屑柔,對于類中的static成員函授,不會傳入this指針珍剑,所以static成員函數無法處理對象的成員數據掸宛,而只能處理類中的static數據。

Paste_Image.png

放在private區(qū)中的constructor函數(singleton)

類的構造函數通常為public招拙,這樣才能構造出很多實例唧瘾。但是,在設計模式中有一種專門把構造函數設計成私有成員别凤,其作用就是保證一個類只能有一個實例饰序,并提供一個全局唯一的訪問點。這種設計模式叫做單例設計模式(singleton)

class Singleton{
    public:
        static Singleton* getInstance(){  
            if(!pIns){
                pIns = new Singleton();
            }
            return pIns ; 
        }
        static void dosth(){……}
        static void destory(){
            if(pIns){
                delete pIns;
                pIns = NULL;
            }
        }
    private:
        singleton(){}
        static singleton * pIns;
};

//調用:
int main(){
    for(int i = 0; i < 10; ++i){
        Singleton *ps  = Singleton::getInstance();//通過全局訪問點訪問规哪,其實只有一個實例求豫,并不是每次循環(huán)都創(chuàng)建
        Singleton::dosth();
    }
    Singleton::destroy();
    return 0;
}

singleton的特點:
不調用getInstance就沒有Singleton類的實例存在,調用一次后,不管再調用多少次蝠嘉,都只有一個實例最疆。

cout——一種ostream,重載了“<<”操作符

cout是一種ostream類蚤告,在其內部針對各種內置數據類型多次重載了操作符“<<”努酸,使其可以輸出內置數據類型的各種實例。因此用戶定義的類中杜恰,如果想重載操作符"<<"获诈,必須定義成全局的操作符重載函數,第一個參數是ostream cout心褐,第二個參數是自定義的類烙荷,這樣才符合cout 在 “<<”左邊,實例在右邊的日常使用習慣檬寂。

cout類的內部實現

complex類终抽,重載操作符“<<”的代碼示例:

class complex{
private:
    double re, im;
public:
    friend ostream & operator<<(ostream & os, const complex& c);
};

ostream & operator<<(ostream & os, const complex& c){
    os << "(" << c.re << "," << c.im << ")" ;
    return os;
}

int main(){
    complex c1(1,2);
    cout << c1 << endl;
}

如果把操作符“<<”的重載設計成類成員函數,則其參數將只能有一個ostream類型桶至,在調用的時候會默認出入this指針作為左值昼伴,這樣對其的調用形式將是:“c1 << cout”,是不是很奇怪呢镣屹?完全不符合我們日常的使用習慣圃郊。
因此切記:對于自定義的類,其操作符“<<”的重載函數必須要寫成全局變量才好女蜈!

類模板與函數模板

類模板

使用時必須顯示指定類型

類模板的定義和使用

函數模板

使用時編譯器會作參數推導持舆,不用顯示指定類型

函數模板參數推導

namespace

幾種使用命名空間方式

使用命令的方式引用

語法:using namespace <名字空間名>

使用聲明的方式引用

語法:using <名字空間名>::<函數名>

不使用using引用

語法:在使用的地方,直接以 <名字空間名>::<函數名> 的方式使用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末伪窖,一起剝皮案震驚了整個濱河市逸寓,隨后出現的幾起案子,更是在濱河造成了極大的恐慌覆山,老刑警劉巖竹伸,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異簇宽,居然都是意外死亡勋篓,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門魏割,熙熙樓的掌柜王于貴愁眉苦臉地迎上來譬嚣,“玉大人,你說我怎么就攤上這事钞它“菀” “怎么了殊鞭?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盐股。 經常有香客問我,道長耻卡,這世上最難降的妖魔是什么疯汁? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮卵酪,結果婚禮上幌蚊,老公的妹妹穿的比我還像新娘。我一直安慰自己溃卡,他們只是感情好溢豆,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘸羡,像睡著了一般漩仙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上犹赖,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天队他,我揣著相機與錄音,去河邊找鬼峻村。 笑死麸折,一個胖子當著我的面吹牛,可吹牛的內容都是我干的粘昨。 我是一名探鬼主播垢啼,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼张肾!你這毒婦竟也來了芭析?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吞瞪,失蹤者是張志新(化名)和其女友劉穎放刨,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體尸饺,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡进统,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了浪听。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螟碎。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迹栓,靈堂內的尸體忽然破棺而出掉分,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布酥郭,位于F島的核電站华坦,受9級特大地震影響,放射性物質發(fā)生泄漏不从。R本人自食惡果不足惜惜姐,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望椿息。 院中可真熱鬧歹袁,春花似錦、人聲如沸寝优。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乏矾。三九已至孟抗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钻心,已是汗流浹背夸浅。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扔役,地道東北人帆喇。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像亿胸,于是被迫代替她去往敵國和親坯钦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,518評論 1 51
  • 第一章 計算機與C++編程簡介 C++程序6個階段編程 ->預處理->編譯->連接->裝入->執(zhí)行1.程序在編譯器...
    rogertan30閱讀 3,844評論 0 1
  • 第一天 一.內聯函數(inline) 函數調用的時候需要建立棧內存環(huán)境侈玄,進行參數傳遞婉刀,并產生程序執(zhí)行轉移,這些工作...
    陳果123閱讀 1,126評論 0 1
  • 只有當一個人獨處的時候,他才可以完全成為自己序仙。
    為了追求不自量力閱讀 292評論 0 1
  • 擁有愿景,使命和價值觀治唤,可以網聚天下志同道合之士棒动,可以提高凝聚力,在遇到眼前困難時不至于人心渙散宾添。 作為個人船惨,要記...
    423429d90f38閱讀 181評論 0 0