C語言到C++(6) - 類和對象

一提到C++,大概很多人最先想到的就是類和對象這組概念哲嘲。C++中的面向?qū)ο笏枷刖褪峭ㄟ^這組概念來實現(xiàn)的笛谦。面向?qū)ο蟮某绦蛟O(shè)計思想大家應(yīng)該并不陌生哲银,在C語言的實踐項目中,我們已經(jīng)多次使用過了鄙才。不熟悉的同學(xué)可以去復(fù)習之前的文章。

這篇文章中,我們會針對一些C++中class常用的使用技巧進行講解芬迄。雖然不會展開來講每一個細節(jié)用法,但希望能起到一個提綱挈領(lǐng)的效果昂秃。

1. 概念

1.1 類和對象的C++定義

剛接觸這組概念的時候禀梳,大部分人會混淆。今天我們嘗試用相對簡單的方式去理解它們肠骆。C++中算途,我們把對象的數(shù)據(jù)類型稱為類。也就是說蚀腿,所謂對象就是一種特殊的變量嘴瓤,這個變量的數(shù)據(jù)類型叫做類。與傳統(tǒng)數(shù)據(jù)類型不同莉钙,類是一種特殊的廓脆,可以自己設(shè)計的數(shù)據(jù)類型,它的功能更強大胆胰。

如圖所示狞贱,左邊是int型變量a,右邊是類A的對象a。從形式上講蜀涨,是不是基本相同瞎嬉,只不過前者的數(shù)據(jù)類型不需要定義,而后者需要定義而已厚柳。

1.2 類和對象的邏輯關(guān)系

從邏輯上講氧枣,類是對象的抽象,而對象是類的具體實現(xiàn)别垮。這句話幾乎困擾過所有學(xué)習面向?qū)ο蟮娜吮慵唷Un堂上,老師總是用桌子和某一個桌子這樣的例子來說明類和對象的邏輯概念碳想,效果并不太好烧董。今天我告訴大家一個最簡單的區(qū)分方法,我們把類和對象放在“什么是一個什么”這樣的句式中胧奔,如果成立逊移,前面的就是對象,后面的就是這個對象的類型龙填,也就是類胳泉。舉個例子拐叉,天花板,如果你分不清哪個是類哪個是對象的話就做下面的嘗試:

> 人是一個天花板  
> 天花板是一個人

很容易分辨出第二句是符合邏輯的扇商,那么天花板就是的一個對象凤瘦。是不是很容易?

當你分清了類和對象的邏輯關(guān)系案铺,下一步就是把這個關(guān)系和程序建立聯(lián)系蔬芥。這需要在不斷的程序設(shè)計練習中慢慢摸索。

1.3 類和對象的物理關(guān)系

在物理結(jié)構(gòu)上控汉,類是抽象的定義坝茎,不占用內(nèi)存空間,而每個對象是具體的暇番,都會占用一段內(nèi)存空間。

2. 類的基本使用

類的使用分兩部分:聲明和使用思喊。按照我的習慣壁酬,下面通過一段具體的代碼來講解它的用法。

#include <iostream>
#include <string>

using namespace std;

// Student類聲明
class Student
{
public:
    Student()
    {
        m_id = 1;
        m_name = "tianhuaban";
        cout << "構(gòu)造函數(shù)" << endl;
    }

    Student(int id, string name) : m_id(id), m_name(name)
    {
        cout << "構(gòu)造函數(shù)1" << endl;
    }

    ~Student()
    {
        cout << "析構(gòu)函數(shù) - " << m_name << endl;
    }

    void Display();

private:
    int m_id;
    string m_name;
};

void Student::Display()
{
    cout << "  id : " << m_id << endl;
    cout << "name : " << m_name << endl;
}

// 類的使用
int main()
{
    Student s1;
    s1.Display();

    Student s2(2, "abc");
    s2.Display();

    return 0;
}

上面這段代碼是一個類的基本使用方法恨课,所有的教科書上都會有舆乔。如果你看不懂,那快去翻翻書剂公,了解了基本的概念之后我們再來繼續(xù)下面的內(nèi)容希俩。

這段代碼的執(zhí)行結(jié)果如下:

接下來我們來看看有哪些需要特別注意的地方。

3. 類的內(nèi)容安排

可能有人注意到了纲辽,大部分課本都把private內(nèi)容寫在前面颜武,而我建議大家把public內(nèi)容寫在前面。在面向?qū)ο蟮脑O(shè)計思想中拖吼,使用類的人最關(guān)心的是對外開放的部分鳞上,而不是私有內(nèi)容。因此吊档,建議大家在安排類內(nèi)部的成員變量和成員函數(shù)時篙议,安裝public,protectedprivate這樣的先后順序怠硼,這個順序其實也是使用者關(guān)注的內(nèi)容順序鬼贱。

另外,所有的成員變量都應(yīng)該定義為private香璃,如果需要外部訪問这难,就添加一組成員函數(shù)來管理。比如增显,我們想在外部訪問學(xué)生id雁佳,可以加兩個成員函數(shù)脐帝。

void SetID(int id);
int GetID();

4. 構(gòu)造和析構(gòu)函數(shù)

構(gòu)造函數(shù)和析構(gòu)函數(shù)最大的特點是沒有返回值,前者是在對象被創(chuàng)建時自動調(diào)用糖权,后者是在對象被銷毀是自動調(diào)用堵腹。我們的例子程序中,這兩個函數(shù)被調(diào)用時會打印出相應(yīng)的文字信息星澳。

需要注意的是疚顷,被重載帶參數(shù)的構(gòu)造函數(shù)我們并沒有寫成下面這個樣子。

Student(int id, string name)
{
    m_id = id;
    m_name = name;
    cout << "構(gòu)造函數(shù)1" << endl;
}

因為這兩種寫法的參數(shù)賦值時間是不同的禁偎,效率也有所差別腿堤,建議使用例子中的寫法。

構(gòu)造函數(shù)和析構(gòu)函數(shù)是一個對稱的存在如暖,很容易讓我們聯(lián)想到代碼的對稱性笆檀。因此,關(guān)于成員變量的內(nèi)存空間生命周期管理應(yīng)該寫在這里盒至。這一點今后我們還會涉及酗洒。

最后要注意的是構(gòu)造函數(shù)和析構(gòu)函數(shù)被調(diào)用的順序,原則是后構(gòu)造出的對象會先被掉用析構(gòu)函數(shù)枷遂。

5. 成員函數(shù)

例子中的Display函數(shù)的實現(xiàn)部分被寫在了函數(shù)的外邊樱衷。這其實是一種常規(guī)的寫法。在實際項目中酒唉,往往把類的聲明寫在.h文件中矩桂,而成員函數(shù)的實現(xiàn)寫在.cpp文件中,這樣對于類的使用者而言痪伦,只需要把精力集中在頭文件上就好了侄榴。

當然,如果某些成員函數(shù)會被頻繁的調(diào)用流妻,那么考慮到效率問題牲蜀,可以像例子中的構(gòu)造函數(shù)那樣把實現(xiàn)部分直接寫在類的聲明中。

6. this指針

接下來我們介紹一些特殊用法绅这。在類的對象中涣达,有一個指向自己的指針this

void Student::SetID(int id)
{
    m_id = id;
}

void Student::SetID(int id)
{
    this->m_id = id;
}

上面這兩種寫法的功能是完全相同的证薇,使用this指針有兩個好處度苔。

好處1

在VS等IDE中,輸入this->之后就會出現(xiàn)成員下拉列表浑度,能夠方便選擇需要的成員變量或成員函數(shù)寇窑,大大提高了編程效率。

好處2

當成員變量名和參數(shù)名相同是箩张,方便區(qū)分兩個變量甩骏。例如:

void Student::SetID(int m_id)
{
    this->m_id = m_id;
}

上面這段代碼中窗市,如果不寫this->編譯器將無法區(qū)分成員變量和形參。當然饮笛,一般的代碼規(guī)范中是不允許出現(xiàn)成員變量和形參名相同這種情況的咨察。

由于類和對象是貫穿在C++中的東西,這一篇中只介紹以上這些最基礎(chǔ)的福青。其他內(nèi)容會在后面的文章中深入講解摄狱。

我是天花板,讓我們一起在軟件開發(fā)中自我迭代无午。
如有任何問題媒役,歡迎與我聯(lián)系。


上一篇:C語言到C++(5) - 字符串變量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宪迟,一起剝皮案震驚了整個濱河市酣衷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌次泽,老刑警劉巖鸥诽,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異箕憾,居然都是意外死亡,警方通過查閱死者的電腦和手機拳昌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門袭异,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炬藤,你說我怎么就攤上這事御铃。” “怎么了沈矿?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵上真,是天一觀的道長。 經(jīng)常有香客問我羹膳,道長睡互,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任陵像,我火速辦了婚禮就珠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘醒颖。我一直安慰自己妻怎,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布泞歉。 她就那樣靜靜地躺著逼侦,像睡著了一般匿辩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上榛丢,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天铲球,我揣著相機與錄音,去河邊找鬼涕滋。 笑死睬辐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的宾肺。 我是一名探鬼主播溯饵,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锨用!你這毒婦竟也來了丰刊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤增拥,失蹤者是張志新(化名)和其女友劉穎啄巧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掌栅,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡秩仆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猾封。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澄耍。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晌缘,靈堂內(nèi)的尸體忽然破棺而出齐莲,到底是詐尸還是另有隱情,我是刑警寧澤磷箕,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布选酗,位于F島的核電站,受9級特大地震影響岳枷,放射性物質(zhì)發(fā)生泄漏芒填。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一空繁、第九天 我趴在偏房一處隱蔽的房頂上張望氢烘。 院中可真熱鬧,春花似錦家厌、人聲如沸播玖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜀踏。三九已至维蒙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間果覆,已是汗流浹背颅痊。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留局待,地道東北人斑响。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像钳榨,于是被迫代替她去往敵國和親舰罚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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

  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束薛耻,并將收入和稅金輸出到文件tax. out营罢。 檢查...
    SeanC52111閱讀 2,778評論 0 3
  • 一個博客,這個博客記錄了他讀這本書的筆記饼齿,總結(jié)得不錯饲漾。《深度探索C++對象模型》筆記匯總 1. C++對象模型與內(nèi)...
    Mr希靈閱讀 5,584評論 0 13
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,516評論 1 51
  • 第一天 一.內(nèi)聯(lián)函數(shù)(inline) 函數(shù)調(diào)用的時候需要建立棧內(nèi)存環(huán)境缕溉,進行參數(shù)傳遞考传,并產(chǎn)生程序執(zhí)行轉(zhuǎn)移,這些工作...
    陳果123閱讀 1,126評論 0 1
  • I tried to build a simple http server. The single threade...
    230eaa7f852d閱讀 266評論 0 0