C++學習 18-11-21
1.建構函式
1.概念
百度百科:建構函式 ,是一種特殊的方法。主要用來在建立物件時初始化物件,即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的一個類可以有多個建構函式 ,可根據其引數個數的不同或引數型別的不同來區分它們即建構函式的過載。
2.呼叫的時機
建立物件時進行呼叫,類似於 python 中定義類時的 init 方法。
3.是否可過載
可以對建構函式進行過載,比如多寫幾個建構函式進行過載。
class CPerson
{
private:
int m_age;
bool m_sex;
public:
CPerson ()
{
m_age = 20;
m_sex = true;
}
CPerson(int age, bool sex)
{
m_age = age;
m_sex = sex;
}
};
2.解構函式
1.概念
百度百科:解構函式(destructor)與建構函式相反,當物件結束其生命週期,如物件所在的函式已呼叫完畢時,系統自動執行解構函式。解構函式往往用來做“清理善後” 的工作(例如在建立物件時用new開闢了一片記憶體空間,delete會自動呼叫解構函式後釋放記憶體)。
課上所學:當一個物件生命週期結束時,其所佔的空間需要被釋放,解構函式就是要刪除類內指標成員在堆區分配的空間。
2.呼叫時機
在物件的生命週期結束時自動呼叫。
3.例子
class CPerson
{
private:
int m_age;
bool m_sex;
char *m_name;
public:
CPerson()
{
m_age = 18;
m_sex = true;
m_name = new char;
}
~CPerson()
{
delete m_name;
m_name = 0;
}
};
2.介面函式
1.定義
百度百科:介面函式就是某個模組寫了(主要)給其它模組用的函式。簡單的說介面函式就是類中的公有函式。
課上所理解:在定義一個類時用來使用其中私有屬性的共有函式(方法)。
2.例子
class CPerson
{
private:
int m_age;
bool m_sex;
char *m_name;
public:
CPerson()
{
m_age = 18;
m_sex = true;
m_name = new char;
}
~CPerson()
{
delete m_name;
m_name = 0;
}
public:
void SetCPersonParam(int age, bool sex, char *name) // 介面函式
{
m_age = age;
m_sex = sex;
m_name = name;
}
};
3.建構函式小知識
1.當一個類有成員屬性時,一定要有建構函式
2.未完待續…
4.完成一個單鏈表類的宣告
有瑕疵程式設計(瑕疵存在於會在return時出現記憶體錯誤)
class CList
{
private:
typedef struct NODE
{
int node_id;
string node_name;
struct NODE *node_p_next;
}Node;
Node *p_head;
Node *p_end;
int length_of_list;
public:
CList()
{
p_head = new Node;
p_head = 0;
p_end = new Node;
p_end = 0;
int length_of_list = 0;
}
CList(int length)
{
length_of_list = length;
}
~CList()
{
delete p_head;
p_head = 0;
delete p_end;
p_end = 0;
}
public:
Node *CreateNode(int id, string name)
{
Node *p_node = new Node;
p_node->node_id = id;
p_node->node_name = name;
p_node->node_p_next = 0;
return p_node;
}
void PushBack(int id, string name)
{
Node *new_node = CreateNode(id, name);
if(p_head)
{
(p_end)->node_p_next = new_node;
}
else
{
p_head = new_node;
}
p_end = new_node;
return;
}
void PopInfront()
{
Node *p_flag = p_head;
if(p_flag)
{
p_head = p_head->node_p_next;
delete p_flag;
p_flag = 0;
}
return;
}
void GetLength()
{
Node *p_flag = p_head;
while (p_flag)
{
CList::length_of_list += 1;
p_flag = p_flag->node_p_next;
}
}
};
int main()
{
CList list1;
list1.PushBack(1, "1");
list1.PushBack(2, "2");
list1.GetLength();
system("pause");
return 0;
}
------------------------------------分割線-------------------------------------------
5.補充
1.對於一個物件的定義,有三種方法:
1.先宣告型別,然後再定義物件
class CPerson
{
};
int main()
{
class CPerson ps1;
CPerson ps2;
}
2.在宣告類的同時定義物件
class CPerson
{
}ps1, ps2;
3.不出現類名,直接定義物件
class
{
}ps1, ps2;
2.C++中結構體與類的異同
1.結構體與類都可以包括成員函式;
2.用struct可以宣告類,與class宣告的類的不同之處在於若不加以private或public的宣告,系統將預設為public;而class則會被預設為private;
3.在類外宣告成員函式
class CPerson
{
private:
int n_age;
int n_sex;
public:
void ShowPersonInfo(); // 公用成員函式原型宣告
}
void CPerson::ShowPersonInfo()
{
cout << n_age << endl;
cout << n_sex << endl;
}
4.內建成員函式
1.定義
在類體中定義的成函式的規模一般都很小,而系統呼叫函式的過程所花費的時間開銷相對是比較大的,呼叫一個函式的時間開銷遠遠大於小規模函式體中全部語句的執行時間。為了減少時間開銷,如果在 類體中 定義的成員函式中 不包括迴圈等控制結構 ,C++系統會自動的對它們作為 內建(inline)函式 來處理。也就是說,在程式呼叫這些成員函式時,並不是真正地執行函式的呼叫過程,而是把函式程式碼嵌入程式的呼叫點。
2.實現
class CPerson
{
private:
int n_age;
int n_sex;
public:
inline void ShowPersonInfo();
};
inline void CPerson::ShowPersonInfo()
{
cout << n_age << endl;
cout << n_sex << endl;
}