به این علت که کامپایلر متغیرهای عضو یک کلاس را در یک section به نام data تعریف میکنه که دقیقا به صورت ترتیبی هستند و بنابراین زمانی که لینکر باید آدرسها را از جداول آدرس دهی استخراج کنه تا برای این متغییر های تعریف شده در این سکشن آدرس های فیزیکی مشخص کنه آدرسها هم به صورت ترتیبی خواهند بود، بنابراین با استفاده از آدرس فیزیکی متغییر با توجه به نوع اون یک مقدار اولیه در استک تعریف میکنه، بنابراین کامپایلر با نام هایی که ما در برنامه تعریف میکنیم کاری نداره و اصلا اونها را نمیشناسه فقط با آدرس اونها کار داره! به همین علت اگر این ترتیب را در زمان تعریف رعایت نکنید داده ها در حافظه دچار همپوشانی خواهند شد.
البته اگر شما به صورت غیر مستقیم در خود سازنده مقدار دهی کنید یعنی به صورت زیر...
class A
{
public:
A() {
b=1;
a=2;
}
private:
int a;
int b;
}
دیگه مهم نیست که ترتیب تعریف متغییرهای عضو کلاس را در زمان مقدار دهی رعایت کنید، رعایت ترتیب مقداردهی در زمان استفاده از direct initializer ctor مهم هست