نوشته شده توسط
pa2ab65
مهمترین دلیل همینه یعنی تخصیص حافظه
یک نمونه از struck یک نوع مقدازیه و در stack ذخیره میشه و در هنگامی که به هم اساین میشن یه کپی از اونا گرفته میشه دقیقاً مثل یه int یا long یا ...(بر خلاف شئ که فقط آدرس و ارجاع کپی میشه و هر دو پس از اساین به یک شئ اشاره می کنند!) اگه توجه کرده باشین intیه ارجاع مستقیم به ساختار Int32 هست و long به Int64. و چون تو stack ذخیره میشه نباید خیلی بزرگ باشه تا سرعت برنامه پایین نیاد.
ولی در عوض یه نمونه از کلاس توی heap ذخیره میشه (واسه اونایی که نمی دونن: Heap یه قسمتی از حافظه برنامست ) ولی البته یه ارجاع از اون ( تو C++ اشاره گر) باید تو stack باشه تا به عنوان متغیر بشه ازش استفاده کرد.
در هنگامی که به آخر دامنه می رسیم نمونه ی struck مثل بقیه ی نوع های مقداری کاملاً پاک میشه ولی شئ فقط ارجاعش پاک میشه! در C++ خود برنامه نویس باید حافظه گرفته شده توسط شئ رو آزاد کنه ولی تو C# و java این garbage collector که پاکش می کنه.
در مورد وراثت هم بگم من تو C# مطمئنم که struck وراثت رو پشتیبانی نمی کنه(راستی اون کدی که نوشتی رو امتحان کردی؟!) البته بعید نیست که VC++ پشتیبانیش کنه چون هر کاری ازش بر میاد ;)
در ضمن struct به شما اجازه ی تعریف سازنده پیش فرض(بدون آرگومان) رو نمیده ولی کلاس میده.
امیدوارم کمک کرده باشم.
دوست عزیز دارید اشتباه می گید
او لبهتره دیدتون رو نسبت به برنامه نویسی شی گرا درست کنید وقتی می نویسید int n شما یه ابجکت ساختید که از نوع کلاس int هست این کلاس هم مثل بقیه کلاس ها یه کلاسه با این تفاوت که به صورت داخلی کامپایلر می دونه باهاش چطوری برخورد کنه در مورد حافظه هم دارید اشتباه می گید
این کد سی رو ببینید
struct test1
{
int i;
char c;
};
int main()
{
struct test1* pt =(test1*)malloc(sizeof (test1));
}
تو یه استراکت تعریف شده که برخلاف گفته شما از حافظه استک استافده نمی کنه بلکه از Heap استفاده می کنه یا اینو ببیند یه کد سی پلاس پلاس هست که یه کلاس تعریف شده ولی حافظه ابکت از استک تامین می شه
class test2
{
int i;
char c;
};
int main()
{
test2 ob;
}