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

چرا اعضای Struct موقع استفاده از {} درست مقدار نمی گیرند ؟

+1 امتیاز

سلام

توی کد زیر

#include <iostream>

struct A
{
   int a, b, c;
};

int main()
{
   A a = {0};
   std::cout << a.a << ',' << a.b << ',' << a.c << '\n';
}

همه ی متغیر ها 0 میشن

ولی چرا وقتی که کد بالا رو این شکلی کنم خروجی 0  0   1 میشه ؟ چرا همه1 نمیشن ؟

#include <iostream>

struct T
{
   int a, b, c;
};

int main()
{
   T t = {1};
   std::cout << t.a << ',' << t.b << ',' << t.c << '\n';
}

 

سوال شده بهمن 26, 1392  بوسیله ی crypto_code (امتیاز 51)   4 7 11
دوباره تگ گذاری شد بهمن 26, 1392 بوسیله ی BlueBlade

2 پاسخ

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

زمان مقدار دادن به آرایه کلاس و... اگر تعداد ورودی های {} کمتر از اعضای عضو باشه ممکنه چند تا حالت پیش بیاد در c++

اگر بخواهید به کلاس مقدار بدین  :

اگر ّبرای کلاس سازنده تعریف کرده باشین و سازنده پیش فرض در دسترس باشه  -->سازنده پیش فرض صدا زده میشه

اگر ّبرای کلاس سازنده تعریف کرده باشین و سازنده پیش فرض در دسترس نباشه کد اجرا نمیشه .

مثال :

class A
{
public:
    A(){cout<<"constructor 1\n";}
    A(int a){cout<<"constructor 2\n";}

};
int main(  )
{
    A a={};
}
// output
// constructor 1

مثال 2 :

class B
{
public:
    B(int){};

};
class C
{
public:
    C(int){};
private :
    C(){};

};


int main(  )
{
    B b={};//error chon default constructor nadarim
    C c[3]={};//error chon default constructor be soorat private tarif shode va behesh dastresi nadarim
}

اگر  برای کلاس سازنده تعریف نکرده باشین اعضایی که مقدار نگرفته باشن هر کدوم بسته به نوعشون مثدار می گیرین .

مثال :

struct S
{
    int a;
};
class T
{
public:
    T(){a=2;};
    int a;
};
class D
{
public :
    int a;
    int b;// zaman meghdar dadan a(0) seda zade mishe
    S s;//zaman meghdar dadan default constructor seda zade mishe
    T t;//zaman meghdar dadan default constructor T seda zade mishe va t.a =2 mishe
};

int main( )
{
    D d={1};
    cout<<d.a;
    cout<<d.b;
    cout<<d.s.a;
    cout<<d.t.a;
}



//output 
// 1002

اگر از {} برای مقدار دادن به آرایه استفاده کنین اعضای آرایه بسته به نوعشون مقدار می گیرن (یعنی اگر آرایه از نوع کلاس باشه به همون شکلی که بالا گفتم ,...)

مثال :

   int a[5]={1};
   cout<<a[0]<<a[1]<<a[2];//output : 100

 

 

مثال 2 :


class B
{
public:
    B(){c=2;};
    B(int a){c=5;};
    int c;
};
class A
{
public:
    int a;
    B b;
};

int main( )
{
   A a[3]={ {1,7} ,{2}  };

   cout<<a[0].a<<"  "<<a[0].b.c<<"\n";
   cout<<a[1].a<<"  "<<a[1].b.c<<"\n";
   cout<<a[2].a<<"  "<<a[2].b.c<<"\n";

}


// output
// 1   5
// 2   2
// 0   2

اگر از {} ّرای مقدار دادن به هیچ کدوم از مواردی که بالا گفتم استفاده نکنین بصورت پیش فرض 0 میگیره .

مثلا  :

   int a={};
   cout<<a;//khorooji 0

 

پاسخ داده شده بهمن 26, 1392 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد اسفند 2, 1392 بوسیله ی Ali Rahbar
+2 امتیاز

سلام

طبق منطق کامپایلر ، وقتی که شما در struct  سه متغیر دارین که میخواید مقدار دهی اولیه کنید اگه به تعداد اعضایی که وجود داره مقدار در نظر بگیرین برای هر کدوم عدد متناظر با خودش رو در نظر میگیره

A a = {1,1,1} ;



ولی اگه تعداد مقادیری رو که بهش میدین کمتر باشه بقیه اون هایی رو که مقدار ندادین خودش صفر در نظر میگیره.

پس یعنی درکُد اولی که شما گذاشتید شما به صورت دستی مقدار اولین متغیر رو برابر صفر قرار دادین و بقیه عناصر هم چون مقدار دهی نشدن صفر شدن ، و در کُد دوم شما به اولی مقدار یک دادین و اون خودش بقیه رو برابر صفر قرار داده.(این موضوع برای آرایه ها هم هست)

پاسخ داده شده بهمن 26, 1392 بوسیله ی Elyas74 (امتیاز 1,144)   6 14 27
...