使用者自訂的資料型別
- 類別是一種自定資料型態的定義,其所產生的實際資料稱為物件(Object)。
- 與結構體struct很像,但類別的功能有,資料封裝(Data Encapsulation)、繼承(inheritance)。
- 類別存取問題
- 類別定義
- Dafault Constructor(預設建構函式)
- Constructs(建構函式)
- Copy Constructors(拷貝建構函式)
- Copy Assignment Operator(拷貝指定運算子)
- Destructs(解構函式)
- 範例Code
類別存取問題
- 類別與結構體不同之一,類別的成員可以使用public、private、protected關鍵字來設定存取權限
- public:任何程式均可直接存取,跟struct結構體一樣
- private:只能讓同類別本身所定義的函式成員進行存取
- protected:類別本身及其衍生類別可對其直接存取,其他部分之程式則不可。
公開程度:public(公開) > protected(不常見) > private(私有)
類別定義
class 類別名稱
{
private:
私有成員宣告;
public:
公開成員宣告;
};
備註:未設定存取權限,預設為private(私有)
Dafault Constructor(預設建構函式)
此建構函式沒有輸入任何參數
建立預設建構函式:
類別名稱( )
{
初始設定;
}
呼叫預設建構函式:
類別名稱 物件的變數名稱;
Constructs(建構函式)
產生物件(Object)時,其資料成員可經由建構函式來設定初值,而建構函式是一個與類別名稱同名的函式成員,一個類別至少一個Constructs(建構函式)。
建立建構函式:
類別名稱(參數列)
{
初始設定;
}
呼叫建構函式:
一般:類別名稱 物件的變數名稱(輸入參數);
指標:類別名稱* 物件的指標名稱 = new 類別名稱(輸入參數)
Copy Constructors(拷貝建構函式)
拷貝建構函式接收已存在的同類別物件作為參數,為避免傳值法拷貝資料的低效率,一般使用傳參考法;然後為避免資料於拷貝時不小心被更改,通常會將此參數宣告為const。
建立拷貝建構函式:
類別名稱(const 類別名& 物件參數)
{
資料逐員拷貝,必要時須配置記憶體;
}
呼叫拷貝建構函式:
Copy Assignment Operator(拷貝指定運算子)
以「=」舉例,想使用「=」, 達成object1 = object2。
建立拷貝指定運算子:
類別名稱& operator=(const 類別名稱&)
{
資料逐員拷貝,必要時需配置記憶體;
回傳物件本身;
}
- 備註1:當類別成員是配置記憶體的指標時,拷貝的是記憶體位置,而非記憶體內的資料
- 備註2:object1 = object2被解讀為,object1.operator = (object2)
呼叫拷貝指定運算子:
Destructs(解構函式)
當物件不再使用時,用來清除記憶體配置,用來釋放在執行建構函式時所配置的動態記憶體
建立解構函式:
~類別名稱()
{
delete 有配置記憶體的類別成員;
delete[] 有配置記憶體的類別成員;
}
範例Code
#include <iostream>
using namespace std;
class x{
private:
int a;//數字a
int **b;//二維陣列b
public:
// default constructor(預設建構函式)
x(){}
// constructs(建構函式)
x(int num){
a = num;
b = new int*[a];
for (int i = 0; i < a; i++){
b[i] = new int[a];
}
for (int i = 0; i < a; i++) {
for (int j = 0; j < a; j++){
b[i][j]=i;
}
}
}
// copy constructors(拷貝建構函式)
x(const x& other) {
a = other.a;
b = new int*[a];
for (int i = 0; i < a; i++) {
b[i] = new int[a];
for (int j = 0; j < a; j++) {
b[i][j] = other.b[i][j];
}
}
}
// copy sssignment operator(拷貝指定運算子)
x& operator=(const x& other) {
a = other.a;
b = new int*[a];
for (int i = 0; i < a; i++) {
b[i] = new int[a];
for (int j = 0; j < a; j++) {
b[i][j] = other.b[i][j];
}
}
return *this;
}
// destructs(解構函式)
~x(){
for (int i = 0; i < a; i++) {
delete[] b[i];
}
}
// print()
void print(){
for (int i = 0; i < a; i++) {
for (int j = 0; j < a; j++){
cout << b[i][j] << " ";
}
cout << endl;
}
}
};
int main(){
x matric1;// 創建物件(matric1)呼叫預設建構函式
x matric2(5);// 創建物件(matric2)呼叫建構函式
x matric3(matric2);// 創建物件(matric3)呼叫拷貝建構函式
matric1 = matric2;// 呼叫拷貝指定運算子,等同:matric1.operator=(matric2);
cout<<"第一部分"<<endl;
matric2.print();
cout<<"第二部分"<<endl;
matric3.print();
cout<<"第三部分"<<endl;
matric1.print();
cout<<"第四部分"<<endl;
x* matric4=new x(2);// 創建陣列物件(matric4)
matric4->print();
delete matric4;
}
Output
第一部分
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
第二部分
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
第三部分
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
第四部分
0 0
1 1