類與對象是C++語言的一個特色,類是對象的抽象,對象是類的實例。
ide
類是抽象的須要佔用內存,而對象時實例化的佔用內存。函數
下面舉個例子:spa
class Time //定義類 { int hour; //定義數據成員 int min; //定義數據成員 int sec; //定義數據成員 }; Time t;
看着這個結構是否是有點眼熟呢,跟C語言中學過的struct的應用很相似,可是二者之間仍是有區別的:在struct中若沒有特別聲明,結構體的成員都是public公有成員;而class默認是private私有成員。調試
類中出了數據成員以外通常還有它的成員函數,說到成員函數咱們最早想到的是構造函數,構造函數的存在就是爲了讓咱們初始化對象(固然也能夠cout<<一些語句,方便咱們調試)。對象
說到初始化,以前在C語言中咱們見過的初始化是這樣的:內存
int i = 0;
可是若是在C++裏這樣初始化對象,那就是萬萬不行的啦
ci
class Time { hour = 0; //錯誤的初始化 min = 0; //錯誤的初始化 sec = 0; //錯誤的初始化 };
因此必定要運用咱們剛纔提到的構造函數。編譯器
構造函數的函數名與類名相同,這是必須的,必須的,必須的(重要的事情說三遍),它沒有返回值,也沒有任何類型,它的功能是用戶本身定義的,可是卻不能被用戶顯式調用,若是用戶本身沒有定義構造函數,那麼編譯器會自動生成一個構造函數,但生成的這個構造函數並無實際的做用,它的函數體是空的。it
class Time //定義類 { public: Time() //定義構造函數,函數名與類名相同 { hour = 0; //利用構造函數來對數據成員進行初始化 min = 0; //利用構造函數來對數據成員進行初始化 sec = 0; //利用構造函數來對數據成員進行初始化 } void Set_Time(void); //函數聲明 void Show_Time(void); // 函數聲明 private: int hour; //定義數據成員 int min; //定義數據成員 int sec; //定義數據成員 }; void Time:: Set_Time(void) //定義成員函數的定義,設置時間 { cin >> hour; cin >> min; cin >> sec; } void Time::Show_Time(void)// 成員函數的定義,顯示時間 { cout << hour << ":" << min << ":" << sec << endl; } Time t; //定義類的對象
構造函數的定義除了上述例子中的那樣無參的構造函數以外,還有帶有參數的構造函數,它的通常格式爲:
編譯
構造函數名(類型名1,形參1,類型2,形參2 ...)
上面的例子可改寫爲
Time(int, int, int); //有參數的構造函數 //在類外定義構造函數 Time::Time(int h, int m, int s) { hour = h; min = m; sec = s; }
C++還提供了另一種初始化數據的方法,那就是參數化表,上面例子的初始化也能夠寫成這樣:
Time::Time(int h, int m, int s) :hour(h) , min (m) , sec (s) {}
與構造函數相對應的就是析構函數了,析構函數的做用是在撤銷對象佔用的內存以前完成一些清理工做,但並非刪除對象。它的用法是在類名前面加一個取反符號「~」,函數中的內容可爲空。
上面例子的析構函數可寫爲
~Time() { cout << "~Time()" << endl; }
一個類能夠有多個構造函數,可是隻能有一個析構函數。
調用構造函數和析構函數的順序至關於一個棧,先構造的後析構,後構造的先析構。