1_بعضی وقت ها مجبوری این کارو بکنی فرض کن یک کلاس که یک سازنده غیر از اون چیزی که پیش فرض هست داره و میخوای یک شی از اون توی یک کلاس دیگه داشته باشی مثلا این کد :
class MyClass1
{
public:
MyClass1(int a)
{
x=a;
}
private:
int x;
};
class MyClass2
{
public:
MyClass2()
{
}
private:
MyClass1 c1(2);
};
کد بالا توی C++ اجرا نمیشه برای اجرا شدن باید به همون شکل اول ( construcotr initializer هم بهش میگن) مقدار بدی :
class MyClass1
{
public:
MyClass1(int a)
{
x=a;
}
private:
int x;
};
class MyClass2
{
public:
MyClass2():c1(12)
{
}
private:
MyClass1 c1;
};
برای مقدار دادن به اعضای const یا refrence کلاس هم باید به همین شکل عمل کنین :
class A
{
public:
A():x(2)
{}
private:
const int x;
};
مورد دوم سرعت بیشتره چون برنامه قبل از صدا زده شدن constructor میاد و همه سازنده های اعضای کلاس رو اجرا می کنه در صورتی که دوباره توی بدنه کلاس مقدار بدین باعث میشه سازنده 2 بار اجرا بشه . ولی در صورت استفاده از : سازنده فقط یک بار اجرا میشه .
مثلا کد زیر رو در نظر بگیرید :
#include <iostream>;
using namespace std;
class MyClass1
{
public:
MyClass1& operator =(const MyClass1& )
{
cout<<"IN OPERATOR ="<<"\n";
return *this;
}
MyClass1()
{
cout<<"In constructor "<<"\n";
}
MyClass1(int a)
{
cout<<"In constructor "<<"\n";
}
};
class MyClass2//slow version
{
public:
MyClass2()
{
c1=MyClass1(2);
}
private:
MyClass1 c1;
};
class MyClass3//fast version
{
public:
MyClass3():c1(MyClass1(2))
{
}
private:
MyClass1 c1;
};
int main()
{
MyClass2 class2;
cout<<"MyClass2 : 2 constructor and 1 operator seda zade mishe !"<<endl;
cout<<"\n\n";
MyClass3 class3;
cout<<"MyClass3 : faghat 1 constructor seda zade mishe"<<endl;
cout<<"____________";
}
توی کد بالا در حالت دوم 1 سازنده و یک operator = کمتر صدا زده میشه .