Chapter 5.2 建構子與解構子 - TKU-ME-Lab/C-C-_tutorial GitHub Wiki
建構子函數
1.建構子函數(constructor)是與類別名稱相同的成員函數,建立者可以用來指定資料初值,建立者必須被定義為公用成員函數,建立者函數不須指定傳回型態
2.建構子函數是使用類別名稱建立物件時,將自動呼叫類別的建立者函數建立物件名稱.若未宣告建立者函數,則建立物件時將呼叫預設的建立者函數,預設建立者函數是一個無參數無敘述的空函數
類別名稱(參數列)
{
//建構子本體
}
Example1:
class Employee
{
int EmpId; //定義私用資料成員
char name[20]; //定義私用資料成員
public:
Employee() //定義無參數建立者函數
{
EmpId = 0; //指定EmpId初值
strcpy_s(name, "zzz"); //指定name初值
}
};
Example2:
class Employee
{
int EmpId; //定義私用資料成員
char name[20]; //定義私用資料成員
public:
Employee(); //宣告無參數建立者函數原型
};
Employee::Employee() //實現無參數建立者者函數
{
EmpId = 0; //指定EmpId初值
strcpy_s(name, "zzz"); //指定name初值
} //類別中宣告建構子函數原型,然後在類別外實現類別的建立者函數
//Example1和Example2的意義是相同的
宣告建構子參數
宣告建構子參數予宣告其他函數一樣,此參數的用途是建立類別物件時傳遞建構子函數的參數,通常建構子參數都是用來起始類別物件的資料成員
類別名稱(參數型態 參數1,參數型態 參數2,……)
{
//建構子本體
}
Example1:
class Employee
{
int EmpId; //定義私用資料成員
char name[20]; //定義私用資料成員
public:
Employee(int id,char *n) //定義建構者函數
{
EmpId = id; //指定EmpId = 參數值id
strcpy_s(name, "zzz"); //指定name = 參數值 *n
}
};
int main()
{
Employee emp1(123,"TOM"); //emp1.EmpId=123,emp1.name = "TOM"
Employee emp2(456,"JOE"); //emp2.EmpId=456,emp2.name = "JOE"
system("pause");
Return 0;
} //僅宣告Employee建構子函數原型,然後在類別外定義Employee函數
因為此建構子有定義參數,所以在以後建立此Employee類別物件時,可給予不同的初值
Example2:
class Employee
{
int EmpId; //定義私用資料成員
char name[20]; //定義私用資料成員
public:
Employee(int id,char *n); //宣告建構子函數原型
};
Employee::Employee(int id, char *n)
{
EmpId = id; //指定EmpId = 參數值id
strcpy_s(name, "zzz"); //指定name = 參數值 *n
}
int main()
{
Employee emp1(123,"TOM");
Employee emp2(456,"JOE");
system("pause");
Return 0;
} //在類別中宣告建構子函數原型,然而在類別外實現類別的建構子函數
//Example1和Example2的意義是相同的
預設建構子參數
預設建構子參數就是宣告參數同時指定參數的初值,因此當建立物件時若沒有傳遞參數,則建立者將使用預設參數
類別名稱(參數型態 參數1=起始值 1,參數型態 參數2=起始值 2,……)
{
//建構子本體
}
class Employee
{
int EmpId; //定義私用資料成員
char name[20]; //定義私用資料成員
public:
Employee(int id,const char *n); //宣告建構子函數原型
};
Employee::Employee(int id=0,const char *n="zzz")
{
EmpId = id;
strcpy_s(name, n);
}
int main()
{
Employee emp1;
Employee emp2(123,"TOM");
Employee emp3(456);
system("pause");
Return 0;
}
解構子
解構子(destructor)與解構子互補的,它被用來釋放物件所佔的記憶體空間,以提供其他物件再使用.解構子的名稱是否定義符號(~)再加上類別名稱
~類別名稱()
Class Employee
{
int EmpId;
char name[20];
Public:
Employee(); //宣告建構子
~ Employee(); //宣告解構子
}