PDA

View Full Version : سوال: constructor دقیقا چه کاری انجام میدهد ؟



who are you
شنبه 23 اسفند 1393, 13:49 عصر
سلام
سازنده چیه؟ لطفا به صورت ساده توضیح بدید
اگر ممکن هست یک مثال هم بزنید که مثلا توی یک کلاس چه کار به خصوصی انجام میده؟

مثلا توی پایتون که به این صورت هست چطوراس ؟ اصلا چرا باید باشه؟ مگه نمیشه یک فانکشن یا متد تعریف کرد فرقی با هم دارن؟
def __init__(

یا تو سی ++

لطفا طوری توضیح بدید که برای یک تازه کار باشه:لبخندساده:
تشکر

chikar
شنبه 23 اسفند 1393, 18:47 عصر
به صورت ساده بگم، وظیفه اصلی سازنده ها مقدار اولیه دادن به نمونه های کلاس (اشیاء) است، یعنی شما وقتی یه کلاس می سازید بهترین راه برای مقدار اولیه دادن به نمونه هاتون استفاده از سازنده است، بهتر بگم سازنده حافظه لازم برای شی جدید رو تخصیص می ده و اون رو مقدار دهی می کنه
حالا حتما این سوال براتون پیش میاد که چرا با استفاده از یک تابع مقدار دهی نمی کنیم؟ بله با استفاده از یک تابع هم می توان مقدار دهی اولیه کرد ولی با توجه به توضیحات فوق استفاده مقدار دهی اولیه با سازنده بسیار عاقلانه تر هست، چون با سازنده است که اصلا حافظه به شی اختصاص داده می شه و همچنین شما حتی در بعضی از موارد می تونید بدون ساخت نمونه از کلاس فقط با آوردن اسم کلاس به کلاستون دسترسی پیدا کنید، در اکثر موارد معمولا ما چند نوع سازنده داریم که هر کدوم رو به یه شکلی مقدار دهی اولیه کردیم
سازنده ها هم نام با کلاس هستند و هیچ نوعی رو هم بر نمی گردونند حتی void هم محسوب نمی شوند.
حالا با مثال بهتر بهتون توضیح می دم


class myclass
{
int X;
public:
//myclass();
//myclass(char);
//myclass(const double &, int *);

myclass(int a) { X=a; cout << X;}
int get_value()
{
return X;
}
~myclass() {};

};



من یه کلاس ساختم به اسم myclass، یه سری سازنده براش تعیین کردم با مقادیر مختلف البته به صورت کامنت(//) که ببینید هر طوری بخواهیم می تونیم سازنده رو مقدار دهی بکنیم. یکی از سازنده ها رو من برای مثال با مقدار int مقدار دهی اولیه کردم و مقدار اون رو داخل متغیر سراسری X قرار دادم، یه تابع هم تعریف کردن برای برگردوندن مقدار X که برای مثال دوم استفاده خواهد شد
در تابع main هم به این شکل شما می تونید از اون استفاده کنید


int main()
{
myclass m(7);
//AND OR ...
myclass(4);
//AND or ...
myclass *A= new myclass(1234);
return 0;
}


در تابع main هم مثال هایی برای مقدار دهی سازنده مشاهده می کنید.
حالا به مثال دوم توجه کنید


class yourclass
{
public:
yourclass(myclass y) { cout << y.get_value();}
};


و در تابع main

int main()
{
yourclass y(myclass(5));
return 0;
}



در کلاس yourclass من یه سازنده تعریف کردم که با یه نمونه از کلاس قبلی myclaass اون رو مقدار دهی کردم، در تابع main هم می بینید که من مقدار سازنده نمونه کلاس yourclass رو با استفاده از کلاس myclass و بدون حتی ساختن یک نمونه از این کلاس انجام داده ام
یه کمی فکر کنم سخت شد، دیگه چاره ای نبود خواستم مفهوم رو متوجه بشید، انشاالله که شده باشید

who are you
یک شنبه 24 اسفند 1393, 12:14 عصر
خیلی ممنون عالی بود

میشه توی این مورد هم کمک کنید
مثلا من میخوام به همین شکل یک ماشین بسازم (البته متنی :لبخند:)
یعنی با استفاده از حلقه سرعت افزایش بده و دنده هم افزایش پیدا کنه

مثلا به این شکل چاپ کنه

سرعت 0
دنده خلاص

سرعت 20
دنده 1

سرعت 40
دنده 2

سرعت 80
دنده 3

سرعت 120 دنده 5

یعنی به این شکل سرعت رو افزایش بده و دنده هم تغییر کنه به تناسب و مرحله به مرحله چاپشون کنه)
میشه یک راهنمایی کنید چطور میشه کلاسش رو نوشت با متد هاش(سرعت - دنده - شتاب )؟ و استفاده از همین سازند درونش
---
البته به صورت شی گرا منظورم هست
خیلی ممنون میشم کمک کنید :خجالت:

chikar
یک شنبه 24 اسفند 1393, 16:06 عصر
لطفا حل تمرین نگذارید، ولی فقط این بار در حد یه راهنمایی ...
یه کلاس هست که در سازنده اش هر عددی به عنوان سرعت بدید بهتون می گه که ماشین دنده چند است
متدهای دیگه رو هم خودتون اضافه کنید


class car
{
int X;
public:
car(int x) {X=x;};
void print()
{
if(X >= 0 && X<= 20)
cout << "Dande 1";
else if(X >= 21 && X<= 40)
cout << "Dande 2";
else if(X >= 41 && X<= 70)
cout << "Dande 3";
else if(X >= 71 && X<= 100)
cout << "Dande 4";
else if(X >= 101 && X<=120)
cout << "Dande 5";
else //if(X > 121 || X<0 )
cout << "Sorry...";

}

~car() {};
};

int main()
{
car c(50);//50 is Speed
c.print();
return 0;
}

output is: Dande 3