一.類::構造函數
1.編碼規範:聲明變量賦初值
int i=0;
int *p=NULL; //最新版本爲nullptr
malloc申請到的內存區域使用memset進行設置
2.對象在定義時進行初始化
完成對象初始化的函數即構造函數
類的對象的初始化只能由類的成員函數來進行;
簡歷對象的同時,自動調用構造函數;
類對象的定義涉及到一個雷鳴和一個對象名;
由於類的唯一性和對象的多樣性,用類名而不是對象名來作爲構造函數名;
默認構造函數:沒有定義構造函數時,編譯器會提共一個默認構造函數;(C++規定,類必須有一個構造函數)
只要定義一個構造函數,C++編譯器就不再提供默認的構造函數;
與定義變量類似,在默認構造函數創建對象時,如果創建的是全局對象或靜態對象,則對象的位模式全爲0,否則對象值是隨機的;
例如:
class Car{
public:
voidrun();
voidstop();
private:
int m_price;
int m_carNum;
};
此類中沒有定義構造函數,編譯器的默認構造函數爲在定義對象時給予m_price,m_carNun一個默認的隨機值。
定義一個構造函數:
class Car{
public:
Car();//構造函數也可以重載;此也爲默認的構造函數
Car(int price=1000,int number=0); //實參必須給初始值 否則定義構造函數將會出錯
voidrun();
voidstop();
void set(int price, int number);
private:
int m_price;
int m_carNum;
};
實現:Car::Car(int price, int number) //定義放在類的的外部時的格式 “類名::”
{
set(price,number); //調用類的成員函數set();
}
構造函數另一個特殊之處是它沒有返回類型,函數體中也不允許有返回值,但可以有無值返回語句 " return;".
如果建立一個對象數組:Desk dd[5]; //對象數組dd,構造函數會被調用5次
3.構造函數的初始化列表中數據的初始化順序和聲明的順序相同
例如:
class Student{
public:
Student(int id):m_id(id),m_score(100) //冒號表示後面要對類的數據成員進進行初始化(性能更快)
{
//一般情況下使用這種構造函數初始化
/*
m_id=id;
m_score=100;
*/
private:
int m_id;
int m_score;
};
構造函數可以有多個,可以被重載;構造函數可以用於隱式類型轉換;//加關鍵字explicit來防止隱式類型轉換
二.類::析構函數
一個類可能在構造函數裏分配資源,這些資源需要在對象不復存在以前被釋放;
析構函數也是特殊類型的成員,沒有返回類型,沒有參數,不能隨意調用,也沒有重載。只是在類對象生命期結束的時候,由系統自動調用;
析構函數名,就是在構造函數名前加上一個邏輯非運算行“~”,表示逆構造函數。
例如:
4 class Student{
5 public:
6 explicit Student(int id); //構造函數
7 ~Student();
//析構函數
8 inline int getId()
9 {
10 return m_id;
11 }
12 void setId(int id)
13 {
14 m_id=id;
15 }
16 inline int getScore()
17 {
18 return m_score;
19 }
20 void setScore(int score)
21 {
22 m_score=score;
23 }
24 private:
25 int m_id;
26 int m_score;
27 };
如果類沒有自定義析構函數,編譯器提供一個默認的析構函數,而且只有一個。