一提到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
,protected
、private
這樣的先后順序怠硼,這個順序其實也是使用者關(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)系。