چرا برای مقدار دادن به اعضای کلاس در سازنده از : استفاده می کنن ؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

چرا برای مقدار دادن به اعضای کلاس در سازنده از : استفاده می کنن ؟

+6 امتیاز

چرا وقتی که می خواهیم به اعضای یک کلاس مقدار بدیم به این شکل عمنل می کنیم :

class A
{
public:
    A():x(7)
    {}

private:
    int x;
};

تفاوت کد بالا با زمانی که به این شکل مقدار بدیم چیه ؟

class A
{
public:
    A()
    {
       x=7;
    }

private:
    int x;
};

 

سوال شده اسفند 7, 1392  بوسیله ی مریم اکرمی (امتیاز 482)   25 55 66
دوباره تگ گذاری شد مهر 9, 1393 بوسیله ی BlueBlade

1 پاسخ

+7 امتیاز
 
بهترین پاسخ


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 = کمتر صدا زده میشه .

پاسخ داده شده اسفند 7, 1392 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده آبان 20, 1393 بوسیله ی BlueBlade
چرا زمان عوض کردن ترتیب مقدار دادن به اعضای کلاس در constructor Initializer کامپایلر warning میده ؟
البته اگر در کلاس پایه یک سازنده کپی صریح ایجاد میشد، بازهم اگر به صورت indirect intilizer base ctor که در کلاس myClass۲ استفاده شده است، مقدار دهی انجام میشد بازهم هم سازنده کپی اجرا میشد وهم سازنده مقدار دهی شده پس دلیل اینکه myClass۳ فقط سازنده مقدار دار فراخوانی میکنه همین موضوع هست که سازنده کپی ضمنی توسط کامپایلر ایجاد شده در این سناریو نیازی به فراخوانی نداشته ولی در تعریف کلاس myClass۲ چون از copy assign operator استفاده شده قطعا تعداد سازندهایی هم که فراخوانی شدند بییشتر هست، البته قطعا روش مقداردهی مستقیم سازنده های کلاس پایه بهتر هستش!
...