سازنده ها در c++11، قسمت سوم: مقداردهی یکسان

تو دو تا پست قبل در باره سازنده‌ها در c++11 نوشتم (اینجا و اینجا). این پست آخر از این سریه و به مقداردهی جدید اختصاص داره.

استاندارد جدید برای مقدار دهی اولیه به انواع مختلف، راه حل یکسانی پیشنهاد می‌ده. در واقع مقداردهی اولیه شبیه به حالتی میشه که قبلا برای آرایه‌های با اندازه ثابت استفاده می‌شد:

[cpp light=”true”]
int arr[4]={0,1,2,3};
[/cpp]

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

  • آرایه‌های پویا:
    [cpp light=”true”]
    int* a = new int[3] { 1, 2, 0 };
    [/cpp]
  • سازنده‌های کلاس‌ها:
    [cpp light=”true”]
    class C
    {
    int a;
    int b;
    public:
    C(int i, int j);
    }; 

    C c {0,0}; //Equivalent to: C c(0,0);
    [/cpp]

  • مقداردهی اولیه به اعضای آرایه‌ای در سازنده:
    [cpp light=”true”]
    class X {
    int a[4];
    public:
    X() : a{1,2,3,4} {} //C++11, member array initializer
    };
    [/cpp]
  • استفاده از std::initializer_list: اگر پارامتر سازنده از نوع std::initializer_list باشه، سازنده میتونه هر چند تا پارامتر بگیره. به طور خاص این حالت برای کلاس‌هایی که به شکل ذخیر کننده عمل می‌کنند مفیده. مثلا containerهای stl:
    [cpp light=”true”]
    vector vs={ “first”, “second”, “third”};
    map singers =
    { {“Lady Gaga”, “+1 (212) 555-7890”},
    {“Beyonce Knowles”, “+1 (212) 555-0987”}};
    [/cpp]

منابع: اینجا و اینجا

سازنده ها در c++11، قسمت دوم: ارث بری و مقدار دهی اعضا

هفته قبل در مورد محول کردن سازنده های c++11 نوشتم. اینجا میخوام دو تا ویژگی جدید در رابطه با سازنده های c++11 رو معرفی کنم:

  1. به ارث بری سازنده ها: واقعا کفر آدم رو در می آورد. بعد اینکه کلاس فرزند رو به ارث می بری باید بشینی دوباره از اول سازنده هاش رو بازنویسی کنی. خوب این قضیه رو c++11 حل کرده. سینتکسش هم این شکلیه:
    [cpp]
    class BaseClass {
    public:
    BaseClass(int value);
    };

    class DerivedClass : public BaseClass {
    public:
    using BaseClass::BaseClass;
    };
    [/cpp]
    چند تا نکته اما هست که باید دقت بشه:

    • این ویژگی تمام سازنده های کلاس پایه رو با هم به ارث میبره. یعنی نمیشه از بین سازنده ها انتخاب کرد.
    • کلاس فرزند دیگه نمیتونه سازنده ای داشته باشه که امضاش با کلاس مادر یکیه. به نظر من البته این نکته خیلی محدود کنندست.
    • اگه کلاسی همزمان دو تا والد داره، نمیتونه سازنده های جفتشون رو به ارث ببره.
  2. مقدار دهی اولیه به اعضای کلاس
    [cpp]
    class SomeClass {
    int value = 5;
    };
    [/cpp]

سازنده ها در c++11، قسمت اول: محول کردن سازنده ها

اولا بگم که ترجمه کردن constructor delegating کار سختیه :ی
خوب! اصل قضیه اینه که معمولا بخش زیادی از کد سازنده های مختلف کلاسها شبیه هم هستند. این مشکل رو تو ‪C#‬ اینطور حل می کنم که یه متد مخفی مث init میسازم و بخشهای مشترک رو تو اونجا انجام می دم. اما c++03 این اجازه رو نمی داد. اما حالا c++11 این مشکل رو به زیبایی حل میکنه: سازنده های مختلف یک کلاس میتونن همدیگه رو صدا بزنن. به این ترتیب میشه یه سازنده اصلی داشت که سازنده های دیگه همشون اون رو صدا میزنن. اینجوری کد منظم تر و شکیل تر میشه.
اینم مثالش از ویکی پدیا:
[cpp]
class SomeType {
int number;

public:
SomeType(int new_number) : number(new_number) {}
SomeType() : SomeType(42) {}
};
[/cpp]