توضیح سازنده و مخرب

از دوستان عزیز خواهش می کنم هر کدوم چیزی در مورد توابع سازنده و مخرب در سی پلاس پلاس و کاربردهای اون می دونن بگن.ممنون می شم.
 

saalek110

Well-Known Member
سلام صالح جان. خوبید؟

کلاس یک قالبی است که از روی آن شی های متعدد ساخته می شود.
چیزی که به کلاس معنای وجودی می دهد متغیرها و متد(تابع) های آن است.

راجع به متغیرهای کلاس که باید گفت مثل همه متغیرهای دیگر محلی برای ذخیره اطلاعات است.
اما راجع به متدها(توابع):
خوب. هر متد کاری انجام می دهد. یعنی هر کدام را که صدا بزنی کاری که کدهای درونش اقتضا می کند را انجام می دهد.
اما دو متد سازنده و مخرب حالت خاصی دارند.
این دو به نوعی صدا زدن اتوماتیک دارند.
مثلا به محض ایجاد شی از کلاس متد سازنده اجرا میشه و نیازی به صدا زدن اون نیست. و دیگر اینکه نام متد سازنده با نام کلاس یکی است. به طرز نامگذاری مخرب هم در کدهای زیر توجه کنید.
خوب. پس متد سازنده و متد مخرب جای خوبیه برای خیلی کارها. مثلا در متد سازنده می شود متغیرهای کلاس را مقدار اولیه داد.
و در متد مخرب هم کارهای موقع تخریب شی.
 

saalek110

Well-Known Member
کد نویسی متد سازنده:


از کتاب:
THEORY AND PROBLEMS
of
PROGRAMMING
WITH C++
JOHN R. HUBBARD,
کد:
class [COLOR="Red"]Ratio[/COLOR]
{ public:
[COLOR="Blue"]Ratio[/COLOR](int n,int d) { num = n; den = d; }
void print() { cout << num << '/' << den; }
private:
int num,den;
};
int main()
{ Ratio x(-1,3), y(22,7);
cout << "x = ";
x.print();
cout << " and y = ";
y.print();
}
نتیجه اجرا که در کتاب گفته بود:
کد:
x = -1/3 and y = 22/7
در برنامه بالا دو شی به نامهای x و y از کلاس ratio ساخته ایم. می بینید که موقع خلق شی ها آمده ایم ورودی داده ایم که میشه ورودی همان تابع سازنده. و تابع سازنده هم از اون ورودی ها برای مقدار دهی به متغیرهای کلاس استفاده کرده.

عکس از همین کتاب در شرح برنامه بالا:

b7.gif

می بینید ما دو شی x و y داریم که متغیرهای درون آنها مقدارهای متفاوتی دارند و متد print با اجرا روی هر شی نتایج خاص خود را دارد.
 

saalek110

Well-Known Member
کلاسی دارای چند متد سازنده:
از همان کتاب.

کد:
class Ratio
{ public:
Ratio() { num = 0; den = 1; }
Ratio(int n) { num = n; den = 1; }
Ratio(int n,int d) { num = n; den = d; }
void print() { cout << num << '/' << den; }
private:
int num,den;
};
int main()
{ Ratio x,y(4),z(22 ,7);
cout << "x = ";
x.print();
cout << "\ny = ";
y.print();
cout << "\nz = ";
z.print();
}
نتیجه اجرا نقل شده از کتاب:
کد:
x = 0/1
y = 4/1
z = 22/7
در برنامه بالا به این خط نگاه کنید:
کد:
Ratio x,y(4),z(22 ,7
شی ها با ورودی های مختلف ساخته شده اند. دلیلش این است که داخل کلاس هم چند تا سازنده داریم. به این چند خط از برنامه بالا نگاه کنید:
کد:
Ratio() { num = 0; den = 1; }
Ratio(int n) { num = n; den = 1; }
Ratio(int n,int d) { num = n; den = d; }
می بینید که 3 سازنده داریم با مقدار ورودی های مختلف.
 

saalek110

Well-Known Member
Using Default Parameter Values in the Ratio Class Constructor
کد:
class Ratio
{ public:
Ratio(int n=0,int d=1) : num(n),den(d) { }
private:
int num,den;
};
int main()
{ Ratio x,y(4),z(22, 7);
}
در کد بالا چند سازنده نداریم ولی می بینید که به انواع مختلف شی ساخته شده. این به این علت است که مقدار دیفالت در ورودی دادن به سازنده تعریف شده.

البته تا جایی که من یادمه مقدار دیفالت برای تابع چیزی محدود به کلاس نیست و همه توابع می توانند چنین خاصیتی داشته باشند ولی گویا در این کتاب برای مقایسه آورده شده که بگه (( اگر دیدی چند نوع ایجاد شی داری دلیلش همیشه داشتن چند سازنده نیست.)).
 

saalek110

Well-Known Member
مخرب: Destructor


کد:
class Ratio
{ public:
Ratio() { cout << "OBJECT IS BORN.\n"; }
~Ratio() { cout << "OBJECT DIES.\n"; }
private:
int num,den;
};
int main()
{ { Ratio x; // beginning of scope for x
cout << "Now x is alive.\n";
} // end of scope for x
cout << "Now between blocks.\n";
{ Ratio y;
cout << "Now y is alive.\n";
}
}

نتیجه اجرا به نقل از کتاب:
کد:
OBJECT IS BORN.
Now x is alive.
OBJECT DIES.
Now between blocks.
OBJECT IS BORN.
Now y is alive.
OBJECT DIES.
چه نتیجه اجرای جالبی دارد.
با اضافه کردن 3 خط آبی شده کد را در توربو سی 3 اجرا کردم:
کد:
[COLOR="Blue"]#include <iostream.h>[/COLOR]
[COLOR="Blue"]#include <conio.h[/COLOR][COLOR="Blue"]>[/COLOR]
class Ratio
{ public:
Ratio() { cout << "OBJECT IS BORN.\n"; }
~Ratio() { cout << "OBJECT DIES.\n"; }
private:
int num,den;
};
int main()
{ { Ratio x; // beginning of scope for x
cout << "Now x is alive.\n";
} // end of scope for x
cout << "Now between blocks.\n";
{ Ratio y;
cout << "Now y is alive.\n";
}
[COLOR="Blue"]
getch();[/COLOR]
}

نتیجه اجرا همان بود.عکس:

b8.gif

نتیجه اینکه موقع از بین رفتن شی خودبخود متد مخرب اجرا می شود.
در کد بالا با بسته شدن بلوک شی ها از بین می روند.

باید دید چه جاهایی این اتفاق(یعنی از بین رفتن شی) اتفاق می افتد. (تحقیق و تست.) همان جاها متد مخرب اجرا می شود.
 

جدیدترین ارسال ها

بالا