PDA

View Full Version : مبتدی: راه درست استفاده از initializer_list برای مقدار دهی به آرگومانهای یک تابع



ehsan_faal
چهارشنبه 31 تیر 1394, 11:35 صبح
سلام دوستان.
من یه تابع نوشتم که ورودیش یه ارجاع به یک وکتور ثابت از جنس عدد مختلطه.
vector<double> poly(const vector<complex<double>>& input)

چرا وقتی میخوام تابع رو فراخوانی کنم اگه این جوری بنویسم:

vector<double> newCoeff{Coupler::poly({(0,1),(0,-1)})};
نتایج غلط میگیرم ولی اگه اینجوری بنویسم:

vector<double> newCoeff{Coupler::poly({complex<double>(0,1),complex<double>(0,-1)})};
نتایج درست میشن؟


با تشکر

rahnema1
چهارشنبه 31 تیر 1394, 15:05 عصر
سلام
اگه به صورت زیر بنویسید درست می شه
vector<double> newCoeff{Coupler::poly({{0, 1}, {0, -1}})};
اما علتش اینه که پرانتز به علت اولویت بالایی که نسبت به بقیه عملگرها داره بتونه گروهبندی انجام بده
یعنی اینجا شما عبارت 0,1 را در یک گروه و عبارت 1-,0 را در گروه دیگه قرار دادید
عبارت 0,1 شامل یک عملگر کاما به همراه دو عملوند int هست
عملگر کاما خاصیتش اینه که همیشه از چپ به راست عملوندهاش اجرا می شن و نتیجه عبارت می شه عدد دومی یعنی نتیجه عبارت 0,1 می شه 1
بنابراین عبارتی که شما به صورت زیر نوشتید
Coupler::poly({(0,1),(0,-1)});
تبدیل می شه به
Coupler::poly({1,-1});
اما چرا می شه complex را به جای پرانتز به صورت {} مقدار دهی کرد؟ و این در حالی هست که complex سازنده ای که initializer_list بپذیره نداره؟ علتش اینه که complex یک کلاس هست که جزء دسته aggregate ها به حساب میاد. یک کلاس برای اینکه aggregate باشه لازمه بعضی خصوصیات داشته باشه ازجمله اینکه عضوهای داده ای اون که غیر استاتیک باشند لازمه public باشند و بعضی خصوصیات دیگه

ehsan_faal
چهارشنبه 31 تیر 1394, 15:13 عصر
ممنون بابت توضیحات.
فقط امکانش هست یه مقدار بیشتر در مورد خواص کلاسهای aggregate بگید؟
public بودن data member ها و ربطشون به initializer_list رو متوجه نمیشم.
مگه این یه خاصیت مربوط به سازنده کلاس نیست؟

rahnema1
چهارشنبه 31 تیر 1394, 15:19 عصر
در خصوص aggregate که آرایه ها هم جزء aggregate به حساب میان می تونید به بخش 8.5.1 از استاندارد مراجعه کنید که قواعد اون را شرح داده
اما اینکه چرا public مثال زیر را در نظر بگیرید

class A{
public:
int a;
int b;
};

A obj;
obj.a = 1;
obj.b = 6;

اگه اعضای کلاس private بودند امکان مقدار دهی اونها به این صورت از بیرون وجود داشت؟ مسلما خیر. خب کار initializer_list هم اینه که اعضای داده ای کلاس را از بیرون مقدار دهی کنه