مبانی ++C برای یادگیری ساختمان داده – به زبان ساده


در این مقاله قصد داریم برخی از مفاهیم ابتدایی مهندسی رایانه را که در زمینه ساختمان داده مفید است به صورت گام به گام ارائه کنیم. به این منظور باید با مبانی ++C آشنا باشیم. این مقاله برای افرادی که میخواهند به طور جدی در این حوزه به مطالعه بپردازند نیز ابزار مناسبی محسوب میشود. ابتدا به بررسی زبان برنامهنویسی ++C میپردازیم.
آشنایی با مبانی ++C
++C یکی از زبانهای برنامهنویسی شیءگرا است. برنامهنویسی شیءگرا خصوصیاتی مانند «کپسولهسازی»، «وراثت»، «چندریختی» و «تجرید» دارد. کپسولهسازی در مورد دریافت دادهها و نگهداری امن و مطمئن آنها در برابر دخالت بیرونی است. این کار از این طریق صورت میگیرد که تنها به تابعهای درون کلاس اجازه میدهیم که متغیرها را تغییر دهند. یکپارچهسازی دادهها و متد (عملیات) در یک واحد منفرد (کلاس) و استفاده از Modifier دسترسی (یعنی public ،private یا protected) دو جنبه مهم کپسولهسازی هستند. درک STL ساخته شده در ++C و استفاده از آن نیز حائز اهمیت است.
اشارهگر شیء
برای توضیح این مفهوم از دو فایل نمونه استفاده میکنیم که کدهای آن را در ادامه میبینید. فایل CircleClass.cpp به صورت زیر است:
فایل ObjectPointer.cpp به صورت زیر است:
با به یاد آوردن مفهوم یک اشارهگر میدانیم که مقدار a و a* هر دو 10 هستند. اشارهگر شیء میتواند در مثال فوق به صورت p* که برای اشاره به شیء یک دونات استفاده میشود نیز مورد توجه قرار گیرد. برای تغییر دادن متغیر، عضو خصوصی دونات شیء باید به یکی از صورتهای زیر باشد:
p->getArea()
یا
(*p).getArea
یا
donut.getArea()
اما نباید به صورت p->radius باشد.
آرایه شیء
به کدهای زیر توجه کنید.
فایل ObjectArray.cpp
به طور مشابه در آرایه شیء میتوان به وسیله
circleArray[0].getArea()
یا
p->getArea()
به مشخصههای خصوصی دسترسی داشت.
به کدهای زیر نیز توجه کنید:
تخصیص استاتیک در برابر تخصیص دینامیک
تفاوت بین تخصیص استاتیک و دینامیک در زمان اجرا، مکان تخصیص و همچنین کلیدواژه مورد استفاده است. با این که تخصیص استاتیک از قبل انجام میشود، اما تخصیص دینامیک حافظه در طی اجرای برنامه صورت میپذیرد. تخصیص استاتیک حافظه روی پشته صورت میگیرد در حالی که تخصص دینامیک حافظه روی هیپ اجرا میشود.
زمانی که مقدار دقیق مورد نیاز برای تخصیص را ندانیم باید از تخصیص دینامیک استفاده کنیم.
در ++C از کلیدواژه new،delete برای تخصیص دینامیک استفاده میشود و همواره از اشارهگر برای تخصیص دینامیک بهره میگیریم. استفاده از آن نیز وضعیت مشابهی دارد. پس از استفاده از حافظه با تخصیص دینامیک باید حتماً آن را حذف کنید.
سازنده، تخصیص دینامیک و حذف
در کدهای زیر نمونههایی از این مفاهیم را مشاهده میکنید:
دینامیک آرایه کلاس
اشارهگر this
This در زبان ++C موارد زیر را شامل میشود:
- شیء در حال اجرای کنونی
- اشارهگر
در مثال فوق دایرههای c1 ،c2 و c از 1، 2 و 3 به 4، 5 و 6 تغییر مییابند.
متغیر ارجاعی
متغیر ارجاعی refn و متغیر n فضای حافظه مشترکی دارند و هر دو به مقدار 2 اشاره میکنند. بنابراین زمانی که یک متغیر ارجاعی اعلان میشود، در واقع هیچ فضای حافظهای ایجاد نمیشود؛ بلکه یک نام جدید برای فراخوانی مقدار قبلی ایجاد میشود.
(refc.setRadius(10 روش صحیح برای تغییر دادن مقدار شعاع refc است که شبیه به (circle.setRadius(10 است.
فراخوانی با ارجاع
مثال فوق نشان میدهد که متغیر ارجاعی در زمان فراخوانی کردن پارامترها و استفاده از آدرس دقیق دادههایی که باید تغییر یابند بسیار آسانتر است. اگر بخواهیم با استفاده از اشارهگر مقدار دو متغیر a و b را با هم عوض کنیم، به صورت زیر عمل میکنیم:
اما در زمان استفاده از متغیر ارجاعی، a و b میتوانند به صورتی که هستند نیز استفاده شوند. دلیل آن این است که متغیر ارجاعی در واقع نوعی قالب اشارهگر است و به آدرس مقداری که قرار است تغییر یابد اشاره میکند:
Overloading
یکی از خصوصیات مهم برنامهنویسی شیءگرا چندریختی است. نمونه گویایی از چندریختی در مباحث Overloading ،Overriding و پارامتر پیشفرض (Default Parameter) است.
Overloading چیست؟
Overloading یعنی با استفاده از نام تابع یکسان، تعداد و نوع پارامترهای متفاوتی را مورد استفاده قرار دهیم.
تابعهای ++C میتوانند با نام یکسان دارای تعداد و نوع پارامترهای مختلفی باشند و این وضعیت در مورد آرایهها و اشیا نیز صدق میکند.

بدین ترتیب میتوان از نام تابع add بارها و بارها استفاده کرد و لازم نیست هر بار نامهای جدیدی مانند intAdd ،doubleAdd ،intAddWithThreeParameter و غیره نوشت.
تابع سازنده تکراری
هدف از تابع سازنده تکراری تعیین مقدار آغازین در زمان ایجاد یک شیء است.
پارامتر پیشفرض
اگر پارامتری دارای مقدار نباشد، این پارامتر با مقدار پیشفرض اعلان میشود. قالب پارامتر پیشفرض به صورت ‘parameter = default value’ است.
شیوه استفاده از پارامتر پیشفرض
- پارامتر عمومی در ابتدا میآید و پارامتر پیشفرض بعد آن قرار میگیرد.
- پارامتر عمومی نمیتواند حذف شود.
برای جمعبندی باید اشاره کنیم که overloading تابع و پارامتر پیشفرض به سادهسازی تابعها کمک میکنند.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش پیشرفته C++ (شی گرایی در سی پلاس پلاس)
- مجموعه آموزشهای مهندسی نرمافزار
- آموزش نوع شمارشی، استراکچر و یونیون در برنامه نویسی C++
- آموزش اشاره گر در برنامه نویسی پیشرفته ++C
==