تابع سازنده (constructor) :
برای مقدار دهی اولیه به مقادیر کلاس به کار می رود و می تواند ورودی بگیرد یا حتی بدون ورودی باشد.
تابع سازنده مقداری را بر نمی گرداند و void هم نیست و حتما باید هم نام با کلاس باشد ، همان طور که گفته شد می تواند به دفعات به صورت بدون مقادر ، با دریافت مقدار و با دریافت مقدار به صورت پیش فرض تعریف شود.
برنامه به صورت پیش فرض تابع سازنده دارد اما برای اینکه با مقادیر کلاس هنگام تعریف مقدار دهید باید از تابع سازنده استفاده کنید.
تابع سازنده کپی (copy constructor) :
برای اینکه هنگام تعریف کلاس مقادیر یک شی از همان کلاس را در آن کپی کنید از تابع سازنده استفاده می شود .
تابعی هم نام با کلاس ، بدون ورودی که هیچ مقداری را بر نمی گرداند و همان طور که گفته شد به صورت پیش فرض توسط خود برنامه فراخوانی می شود.
کامپایلر به صورت پیش فرض تابع سازنده دارد اما هنگامی که از اشاره گر ها یا مقادیر پویا (dynamic) استفاده می کنید باید حتما از سازنده کپی استفاده نمایید چرا که بدون سازنده به جای مقادیر متغیر مورد نظر تنها آدرس آن در اشاره گر جدید کپی می شود یعنی برای یک خانه حافظه دو اشاره گر خواهیم داشت (این اتفاق باعث می شود عملا دسترسی شما به خانه حافظه شی جدیدالتعریف تان از دسترس خارج شود و تغییرات روی شی ای که از آن کپی گرفته اید اعمال شود)
تفاوت تابع سازنده کپی با عملگر(operator) = در این است که از عملگر = در همه جای برنامه می توان استفاده کرد اما تابع سازنده در زمان تعریف شی فراخوانی می شود.
تابع مخرب (destructor) :
هنگامی که کارمان با یک شی تمام می شود بهتر است خانه حافظه هایی که توسط آن در RAM اشغال شده است را آزاد کنیم برای این کار از تابع مخرب استفاده می کنیم.
تابعی است هم نام با کلاس به علاوه علامت (مَد) ~ (در صفحه کلید انگلیسی بالای tab قرار دارد) بدون ورودی که خروجی را بر نمی گرداند .
به صورت خودکار در پایان هر بلاک {} فراخوانی می شود . مقادیری که به صورت پویا تعریف شده اند (یعنی با دستور new) را با دستور delete از حافظه خارج می کنیم اما سایر مقادیر مانند مقادیر اولیه دیگر نیازی به حذف با delete ندارند.
#include <iostream>
using namespace std;
class myclass{
int a,b;
int *c; //single
int *d; //array
public:
myclass(const myclass &A) //copy constructor
{
a=A.a;
b=A.b;
c=new int;
*c=A.c[0];
d=new int[5];
for(int i=0;i<5;i++)
d[i]=A.d[i];
}
myclass(int a1,int b1 , int c1,int d0,int d1,int d2,int d3,int d4) //constructor with value
{
a=a1;
b=b1;
c=new int;
*c=c1;
d=new int[5];
d[0]=d0;
d[1]=d1;
d[2]=d2;
d[3]=d3;
d[4]=d4;
}
myclass() //constructor without value
{
a=1;
b=2;
c=new int;
*c=3;
d=new int[5];
d[0]=11;
d[1]=12;
d[2]=13;
d[3]=14;
d[4]=15;
}
~myclass() //destructor
{
delete c;
delete [] d;
cout<<"Destructor"<<endl; //message for show when destructor is run
}
void set(int a1,int b1 , int c1,int d0,int d1,int d2,int d3,int d4)
{
a=a1;
b=b1;
*c=c1;
d[0]=d0;
d[1]=d1;
d[2]=d2;
d[3]=d3;
d[4]=d4;
}
void print()
{
cout<<a<<endl;
cout<<b<<endl;
cout<<*c<<endl;
cout<<d[0]<<endl;
cout<<d[1]<<endl;
cout<<d[2]<<endl;
cout<<d[3]<<endl;
cout<<d[4]<<endl;
cout<<endl; //space
}
};
void Des()
{
myclass D;
}
int _tmain(int argc, _TCHAR* argv[])
{
myclass A(10,20,30,0,1,2,3,4);
myclass B=A;
myclass C;
A.set(100,200,300,5,6,7,8,9);
A.print();
B.print();
C.print();
Des(); //this function just for show destructor running after compiler pass block {}
system("pause");
return 0;
}