View Full Version : مقدار دهی به سازنده ها آقای لی فور
رامین مرادی
سه شنبه 18 مهر 1391, 22:02 عصر
با سلام دوستان می خواستم صحت یه حرف رو از نویسنده یک کتاب برام شرح بدین
دوستان تو کتاب برنامه نویسی شی گرا در سی ++ آقای لی فور
یه سازنده به این شکل نوشته بود
class()
{
var=10;
}
خوب این کد رو نوشته بود و گفته بود که این نوع مقدار دهی به متغییر های کلاس روش مطلوبی نیست در ادامه این کد آورده شده بود
class():var=10
{
}
و گفته بود از این روش استفاده شود این مطلب رو می تونید واسه من توضیح بدید.
چون من تو سی لز روش دوم استفاده می کردم و تو سی شارپ هم تست کردم خطا گرفت آیا این اصل تو سی شارپ عوض شده؟؟؟؟؟
hadi0x7c7
سه شنبه 18 مهر 1391, 23:00 عصر
این به این دلیل میتونه باشه که شما توی body چک کنی که ایا این یک instance از نوع معتبر میسازه یا نه.
مثل این:
Date::Date(int yy, Month mm, int dd)
: y(yy), m(mm), d(dd)
{
if (!is_date(yy,mm,dd)) throw Invalid();
}
رامین مرادی
شنبه 22 مهر 1391, 19:42 عصر
من که قانع نشدم بقیه دوستان نظرشون چیه(البته نظر شما قابل احترامه دوست عزیز)
رامین مرادی
جمعه 28 مهر 1391, 18:50 عصر
دوستان ديگه نظري ندارن من يه راه حل ژيدا كردم ولي دارم روش تحقيق مي كنم ببينم كه آيا اين كارم درسته يا نه اگه دوستان نظري دارن بگن اگه ندارن من هم نظرم رو مي زارم
رامین مرادی
یک شنبه 17 شهریور 1392, 12:29 عصر
بازم اين پست خاك خورده رو بالا آوردم ولي هينوز جوابش رو نيافتم اگه كسي اطلاعي از اين مورد داره نظرشو بگه.............
omidshaman
یک شنبه 17 شهریور 1392, 14:26 عصر
به 2 دلیل 1 سرعت بالاتر (بعضی وقتا البته)
2_گاهی وقتا هم مجبوری این کارو بکنی فرض کن یک کلاس که یک کانستراکتور غیر از اون چیزی که پیش فرضه داری و میخوای یک ابجکت از اون توی یک کلاس دیگه داشته باشی مثلا این
class MyClass1
{
public:
MyClass1(int a)
{
x=a;
}
private:
int x;
};
class MyClass2
{
public:
MyClass2()
{
}
private:
MyClass1 c1(2);
};
کد بالا توی C++ اجرا نمیشه حالا تنها راه حلی هم که داری اینه که همون جوری مقدار اولیه بدی به کلاس myClass1
کدو زیر رو ببین فکر کنم کاملا واضح باشه اگر نفهمیدی بگو بیشتر توضیح میدم
class MyClass1
{
public:
MyClass1(int a)
{
x=a;
}
private:
int x;
};
class MyClass2
{
public:
MyClass2():c1(12)
{
}
private:
MyClass1 c1;
};
omidshaman
یک شنبه 17 شهریور 1392, 15:12 عصر
یکی از جاهایی هم که این جوری مقدار دادن به کار میاد رو همhadi0x7c7 گفتن.
درباره سرعت هم بعضی وقتا که باز قرار باشه یک کلاس داخل یک کلاس دیگه استفاده کرد اون جوری مقدار دادن باعث میشه چند تا فانکشن کمتر انجام بشه مثلا کد زیر رو اجرا کن نتیجشو ببین .
#include <iostream>;
using namespace std;
class MyClass1
{
public:
MyClass1& operator =(const MyClass1& )
{
cout<<"IN OPERATOR ="<<endl;
return *this;
}
MyClass1()
{
cout<<"In constructor "<<endl;
}
};
class MyClass2//slow version
{
public:
MyClass2()
{
c1=MyClass1();
}
private:
MyClass1 c1;
};
class MyClass3//fast version
{
public:
MyClass3():c1(MyClass1())
{
}
private:
MyClass1 c1;
};
int main()
{
MyClass2 class2;
cout<<"MyClass2 : 2 constructor and 1 operator seda zae mishe !!!!"<<endl;
cout<<"\n\n";
MyClass3 class3;
cout<<"MyClass3 : faghat 1 constructor sedazade mishe"<<endl;
cout<<"____________";
}
رامین مرادی
دوشنبه 18 شهریور 1392, 19:06 عصر
يعني وقتي يه كلاسي تو سازندش مقدار ميگيره تو كلاس ديگه كه قراره از اون كلاس استفاده شه بايد اينطوري مقدار دهي كرد اگه درست گفتن بهم تبريك بگيد .
يعني سرعت تو اين مسئله خيلي به چشم مياد!!!!!!!
omidshaman
دوشنبه 18 شهریور 1392, 19:53 عصر
يعني وقتي يه كلاسي تو سازندش مقدار ميگيره تو كلاس ديگه كه قراره از اون كلاس استفاده شه بايد اينطوري مقدار دهي كرد اگه درست گفتن بهم تبريك بگيد .
آره همین جوریه .
البته بهتره همیشه همون جوری که کتاب گفته استفاده کنی خوانایی بیشتری هم داره کد.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.