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();   //宣告解構子
}