کلاس دیگه چه مزایایی داره؟(به غیر از تعریف متغیر و تابع سطح دسترسی به اونا)
این نوع تعریف کلاس ها باعث میشه که ما بتونیم یک شی رو تعریف کنیم. این شی قابلیت کپسوله بودن رو داره یعنی برای کار با این کلاس(شی) شما نیاز ندارید که بدونید چی داخل اون هست و از بروز خطا جلوگیری میکنه. انگار شی شما داخل یک کپسول هست و دسترسی به متغیر های داخل اون نیست.
این شی بودن باعث به وجود اومدن حلت های ارث بری میشه.یعنی یک شی زیر مجموعخ یک شی عام تر هست. خواص شی مادر رو به ارث میبره و از طریق همین ارث بری خیلی قابلیت ها رو به سادگی میشه منتقل کرد. در کل این ها همه به لایه لایه بودن برنامه کمک میکنند.
خیلی قابلیت هایی داره که برنامه نویسی رو ساده تر میکنه و واقعا کاربردی هست.این چیزا رو در مثال باید دید تا بشه درک کرد. مثلا تابع با اسم یکسان داخل چند شی هست مثلا تابع مساحت.
اشیا ما هم شامل مربع و مثلث و دایره اند.(هرسه کلاس باید دختر یک کلاس مادر به نام شکل باشند!!!)
از ورودی تعدادی شکل گرفتیم و در یک آرایه ذخیره شده.به ترتیب مساحت هر کدوم از این شکل ها باید حساب بشه.وقتی تابع مساحت صدا میشه خود کامپایلر بر اساس جنس شی تابع مربوط به خودش رو صدا میکنه و تو یه حلقه for ساده تمام مساحت ها حساب میشه.
اگر متوجه مثال نشدید مهم نیست. این چیز ها رو باید پله پله دید.هدف از ذکر این مثال گسترده بودن کاربرد اشیا هست. خیلی کاربرد ها داره که من نمیدونم و اگر ببینم برام عجیب هست. با یکم تمرین و صبور بودن میتونید خیلی راحت به مفهوم شی و شی گرایی این زبون مسلط بشید.(خبر خوب این که خیلی زبون های دیگه هم شی گرایی رو تو مایه های سی++ دارند و اگر بر این مسلط باشید درک اون ها هم خیلی ساده هست.)
میشه در مورد struct بیشتر توضیح بدید؟کی استفاده میشه و ...
فقط به متغیر ها محدود میشه یا اینکه کار های بیشتری هم میشه باهاش انجام داد؟
در مورد <- هم توضیح بدید
ممنون
میشه در مورد struct بیشتر توضیح بدید؟کی استفاده میشه و ...
فقط به متغیر ها محدود میشه یا اینکه کار های بیشتری هم میشه باهاش انجام داد؟
در مورد <- هم توضیح بدید
ممنون
ساختار ها جز زبون سی حساب میشند. کار اصلیش ایجاد نوع متغییری جدید هست. مثلا متغیری برای نگه داشتن زمان نداریم. میتونیم این نوع رو با ساختار ها بسازیم.3تا متغییر 8 بیتی ساده میتونند به راحتی این متغییر رو بسازند. مثالش تو پست اول هست.
برای دسترسی به اعضای ساختار ها از . استفاده میشه اما اگه با یه اشاره گر دسترسی داشته باشیم باید از عملگر <- استفاده بشه.
از همه دوستان عذرخواهی میکنم که چند روزی فرصت نبود که بیام و ادامه بدم.
یه باره union رو هم بگید دیگه :biggrin:
کلا تاپیک رو کردی آموزش سی :mrgreen:
union نحوه ی تعریف و دسترسی و کلا همه چیزش شبیه به struct هست ولی یه تفاوت داره و اون هم نوع گرفتن حافظه هست. در ساختار ها اگر 5 متغیر 4بایتی داشته باشیم فضای اشغال شده ما برابر 20 بایت خواهد بود ولی اگر در union ها 5متغییر 4 بایتی داشته باشیم فضای اشغال شده ما 4 بایت خواهد بود.یعنی فضای مشترکی دارند همه ی پارامتر ها و در هر لحظه یکی از متغییر ها مقدار حقیقی داره. بعضی کاربرد های خاصی رو داره این مشترک بودن فضا ولی در کل ساختار ها کاربردی تر از union ها هتند چون متغییر ها هر کدوم فضای مشخصی دارند.....
راستی اگه میشه نحوه نوشتن یه کتابخونه استاندارد رو توضیح بدید
این یکم بحثش طولانی هست و یکم باید با نحوه کامپایل شدن کد ها آشنا بود.کلا کتابخونه ها یا اپن سورس هستند و یا بدون سورس.فعلا با بدون سورس کاری نداریم.
ساده ترین کار این هست که شما یه فایل .h باز کنید و کدهایی که برای توابع در نظر دارید رو توی اون بنویسید. بعد با include کردن اون فایل به پروژه اضافه کنید.
خیلی اوقات پیش اومده که کتابخونه ای دیدید که .h نداره و فقط یه فایل .c هست.قبلش این نکته در مورد کامپایل شدن رو بخونید:
اگر تو فایل اصلی برنامه ما prototype تابع ها رو بنویسیم(فقط تعریف تابع و بدون تعریف بدنه). موقع کامپایل چون این توابع تعریف شده هستند کامپایل با موفقیت انجام میشه و میرسیم به مرحله link . تو این مرحله تو تمام فایل های .c که داخل پروژه هست دنبال بدنه این توابع میگرده. اگر پیدا شد که با موفقیت فایل نهایی رو میده اما اگه بدنه رو پیدا نکرد linker error رو به شما میده.این سیستم تو تمام پروژه های چند فایلی هست.
اگر کتابخونه شما تو یه فایل .c نوشته شده باشه باید اون رو به پروژه اضافه کنید و prototype رو تو فایل اصلی بنویسید.
حالت دیگه که پر کاربرد تر هست به این شکل هست که تعریف متغییر ها و prototype توابع رو داخل یه فایل .h بنویسید و این فایل رو با include به فایل اصلی اضافه کنید. حالا بدنه توابع رو داخل یه فایل .c مینویسیم و این فایل .c رو هم به پروژه اضافه میکنیم.(یادتون نره هر دو فایل به یه اسم باشن که بشه فهمید چی به چی هست.یکی .h و اون یکی .c .نکته بعد هم اینکه فراموش نکنید هدر رو تو فایل .c هم include کنید.
کتابخونه خودش چیز پیچیده ای نیست فقط قسمتی از برنامه رو تو یک فایل جدا مینویسیم که قابل انتقال باشه.
برای کتابخونه اگر شرایط خاصی باشه تا امکان استفاده از اون ممکن بشه از کامپایل شرطی از طریق پیش پردازنده ها استفاده میکنیم.
اگه چیز دیگه ای هم هست که نمیدونیم بگید
من از کجا بدونم کی چی رو نمیدونه :mrgreen: خودتون بپرسید......
ساختار ها جز زبون سی حساب میشند. کار اصلیش ایجاد نوع متغییری جدید هست. مثلا متغیری برای نگه داشتن زمان نداریم. میتونیم این نوع رو با ساختار ها بسازیم.3تا متغییر 8 بیتی ساده میتونند به راحتی این متغییر رو بسازند. مثالش تو پست اول هست.
برای دسترسی به اعضای ساختار ها از . استفاده میشه اما اگه با یه اشاره گر دسترسی داشته باشیم باید از عملگر <- استفاده بشه.
الان زمان در این تابع که به صورت اشاره گر تعریف شده است به کجا اشاره می کند مگر در اشاره گر ها اول نباید آدرس جایی را که اشاره می کند را تعریف کرد مثلا int *p,x , *p= &a
در حال حاظر این متغییر زمان به جایی اشاره نمیکنه.این فقط یک تابع هست که ورودی اون یک اشاره گر هست. زمان کلا به هر متغییری که تو آرگومان این تابع بیاد اشاره میکنه. تو تابع main مثلا این طور تعریف مینویسیم:
TIME zamandar;
test(&zamandar);
بعد از صدا کردن این تابع حالا زمان به موقعیت زماندار اشاره میکنه. از اشاره گر استفاده کردیم چون ارسال یک اشاره گر به تابع خیلی سریعتر از ارسال خود متغییر هست+ حافظه کمتری اشغال میشه و استک کوچیک میمونه.
مثلا int *p,x , *p= &a
خود شما هم اشتباه تعریف کردید. باید بنویسید p=&a; که p به فضای حافظه ی a اشاره کنه. وقتی قبل از p یک ستاره میزارید آدرس متغییر a رو تو جایی که p اشاره میکنه میریزه. در اینجا هم که مقدار خاصی رو نداره پس یک جایی مینویسه که ممکنه وجود نداشته باشه.اگرم که مقدار معتبر داشت که محتوای اون رو خراب میکرد.....
این ساختار از 2تا متغیر 2 بایتی تشکیل شده+ یک متغییر 1 بایتی. پس کلا 5 بایت مصرف میشه.
برای اینکه بتونید به صورت نوع داده ای برخود کنید typdef رو فراموش نکنید.
آرایه ها دیتا هایی از یک جنس رو پشت سر هم ذخیره میکنند اما در ساختار ها نیازی به یکسان بودن نوع داده ها نیست. در مورد اینکه آیا پشت سر هم هستند و یا هم اطلاعی ندارم.ممکنه به خاطر عملکرد مثلا garbage collector دیتا در جاهای مختلفی ذخیره بشه. نحوه دسترسی هم که فرق داره. هر دو از دسته ی container ها هستند اما عملکرد مختلف دارند.
ساختار ها جز زبون سی حساب میشند. کار اصلیش ایجاد نوع متغییری جدید هست. مثلا متغیری برای نگه داشتن زمان نداریم. میتونیم این نوع رو با ساختار ها بسازیم.3تا متغییر 8 بیتی ساده میتونند به راحتی این متغییر رو بسازند. مثالش تو پست اول هست.
برای دسترسی به اعضای ساختار ها از . استفاده میشه اما اگه با یه اشاره گر دسترسی داشته باشیم باید از عملگر <- استفاده بشه.
سلام من این کد رو نفهمیدم
کد داره میگه مثلا اگه تابع رو تو مین استفاده کردیم و اسم یه ساختار رو اونجا به جای زمان که از نوع تایم هست رو نوشتیم این تابع میاد و ساعت و دقیقه اون ساختاری رو که تو تابع صدا زدیم رو برابر 10 میکنه و ساختار زمان به عنوان ساختار ورودی در تابع استفاده شده که بشه جز به جز ساختار مورد نظر رو مقدار دهی کرد درسته؟
بعد از این میشه کلا درباره اشاره گر ها صحبت کنید من هیچی نمیدونم ازش
با تشکر
struct Man{
;int vazn
;int ghad
;char rangcheshm
};
[/pre]
سلام
منم یک سوال دارم
در برنامه اصلی می نویسم
struct Man *m;
این m به کدام آدرس اشاره می کند ؟ ما که هنوز آدرس آن را تعریف نکردیم ولی می توانیم در ادامه از آن استفاده کنیم
چرا اینجا تعریف آدرس برای اشاره گر صورت نمی گیرد؟
سلام من این کد رو نفهمیدم
کد داره میگه مثلا اگه تابع رو تو مین استفاده کردیم و اسم یه ساختار رو اونجا به جای زمان که از نوع تایم هست رو نوشتیم این تابع میاد و ساعت و دقیقه اون ساختاری رو که تو تابع صدا زدیم رو برابر 10 میکنه و ساختار زمان به عنوان ساختار ورودی در تابع استفاده شده که بشه جز به جز ساختار مورد نظر رو مقدار دهی کرد درسته؟
بعد از این میشه کلا درباره اشاره گر ها صحبت کنید من هیچی نمیدونم ازش
با تشکر
حالا مقدار دهی یا هر پردازش دیگه. نکته ای که هست اینه که به جای تعریف یه متغییر جدید در تابع از همون متغییر که تو مین هست استفاده میشه و اشاره گر اون به تابع میاد. سودش کوچک نگه داشتن فضای استک هست.
اشاره گر ها هم چیز پیچیده ای نیستند. یه متغییر هستند که آدرس فضای خاصی رو نگه میدارند.کاربردش هم تو جاهایی هست که یه سری از داده ها رو مورد نیاز داریم. حالا به جای اینکه با کل اون داده ها کار کنیم با آدرس اون ها کار میکنیم که ساده تر هستند. حالا سوالتون از اشاره گر ها چیه؟
نوشته اصلی توسط alirf
سلام
منم یک سوال دارم
در برنامه اصلی می نویسم
struct Man *m;
این m به کدام آدرس اشاره می کند ؟ ما که هنوز آدرس آن را تعریف نکردیم ولی می توانیم در ادامه از آن استفاده کنیم
چرا اینجا تعریف آدرس برای اشاره گر صورت نمی گیرد؟
وقتی شما مینویسید Man *m در اصل یک اشاره گر تعریف کردید که میتونه به یه متغییر من اشاره کنه. در حال حاضر شما نگفتید که به کدوم متغییر من اشاره کنه پس آدرس درستی رو نگه نمیداره در حال حاضر.
شما میتونید یه متغییر من تعریف کنید و آدرس اون رو به این اشاره گر نسبت بدید.
دیدگاه