کدنگار

وبلاگ شخصی-آموزشی علی رشیدی

کدنگار

وبلاگ شخصی-آموزشی علی رشیدی

طبقه بندی موضوعی
پیوندهای روزانه
پیوندها

آموزش شی گرایی در ++C - قسمت اول

پنجشنبه, ۲۱ دی ۱۳۹۶، ۰۹:۰۷ ب.ظ

قسمت اول: مفاهیم اولیه

شی گرایی یعنی اینکه هر مفهوم و مدلی را در برنامه نویسی بتوانیم با استفاده از یک شی پیاده سازی کنیم. مثلا یک کتابخانه را در نظر بگیرید: این کتابخانه دارای خصوصیاتی مانند نام، ظرفیت کتاب و لیستی ازکتاب هاست. از سوی دیگر این کتابخانه دارای رفتار هایی مانند حذف، اضافه و جستجو است. این دو ویژگی تقریبا در هر شیئی یافت میشوند. یک سنگ جرم دارد و میچرخد، یک ماشین اسم دارد و سوحت مصرف میکند و ... . پیاده سازی مدل ها، ساختمان داده ها و تقریبا هر چیز با این طرز فکر، برنامه نویسی را ساده، قابل فهم و لذت بخش میکند.
حالا که خصوصیات کلی اشیا را میدانیم بیایید با یک مثال به بررسی پیاده سازی چنین چیزی در ++C بپردازیم.

در این مطلب:
  • معرفی ساختار یک شی
  • پیاده سازی یک شی دانش آموز (کد در انتهای مطلب فابل دانلود است)
  • آزمایشگاه

مثال: شی دانش آموز

برای پیاده سازی شی دانش آموز در ++C ابتدا باید آنرا نیازسنجی کنیم. یک دانش آموز مشحصاتی مانند نام، کد ملی، و لیست نمرات دارد. همچنین عملیاتی مانند افزودن نمره و ویرایش نمره دارد. اکنون شروع به پیاده سازی این خصوصیات و رفتارها میکنیم.

شی

یک شی در ++C با کلمه کلیدی class تعریف میشود. از لحاظ سینتکس تقریبا شبیه struct است:


class ClassName
{
access modifier 1:
properties and behaviours
access modifier 2:
properties and behaviours
...
};

Access Modifiers

خصوصیات و رفتارها بر اساس امکان دسترسی به آنها از خارج در دسته بندی هایی قرار میگیرند. فعلا فقط مشخصه های دسترسی public و private را مطالعه میکنیم. رفتارها و مشخصات (که به طور اختصار به آنها اعضا میگوییم) که با public مشخص میشوند خارج از بدنه کلاس نیز قابل دسترس اند.

اما اعضای private فقط داخل بدنه کلاس قابل دسترس اند.


رفتارها

رفتارها در اشیا همان توابع هستند که کار خاصی انجام میدهند. در این مبحث به آنها متُد میگوییم.


ویژگی ها

همان متغیر ها هستند و ویژگی ها و وضعیت یک شی را مشخص میکنند.


پیاده سازی

ابتدا خصوصیات شی را پیاده سازی میکنیم. در حالت کلی خصوصیات یک شی را به صورت private  تعریف میکنیم و تغییر و دسترسی به آنها توسط متد ها انجام میگیرد.

نام شی را Student میگذاریم.

class Student
{
public:

private:
string name;
string lastName;
string id;

vector<float> marks;
};

اگر قبلا با struct کار کرده باشید، متوجه میشوید که تعریف خصوصیات مانند تعریف اعضای struct است. با این تفاوت که این اعضا در اینجا private هستند اما در struct مانند public بودند، یعنی میشد آنها را از خارج دستکاری کرد. درباره این موضوع در قسمت آزمایشگاه بیشتر میفهمیم.


اکنون متد ها را اضافه میکنیم. متد هایی که فعلا با آنها سر و کار داریم از بیرون قابل دسترسی اند و برای انجام یک عمل خاص روی شی به کار میروند (مانند گرفتن/تغییر دادن خصوصیات، درج نمره و ...)

class Student
{
public:
void setName(string val)
{
name = val;
}

string getName()
{
return name;
}
//Other getters/setters...

void addMark(float val)
{
marks.push_back(val);
}

 ادامه بدنه کلاس بدون تغییر میماند.


دانلود مثال دانش آموز

فایل زیر شامل یک برنامه است که شی دانش آموز را پیاده سازی و استفاده کرده است. پس از مطالعه کامل آن، ادامه مطلب یعنی آزمایشگاه را بخوانید.

دانلود

آزمایشگاه

اکنون به بررسی شرایطی میپردازیم که ممکن است جای سوال یا ابهام داشته باشند.

متغیر های قابل دسترسی در متد ها

اگر یادتان باشد در برنامه نویسی تابعی، هر تابع به متغیر های تعریف شده در بدنه تابع و متغیر های پاس داده شده به آن دسترسی داشت. در متد ها، متعیرهای تعریف شده در کلاس (چه private چه public) در هر متد قابل دسترسی اند. مانند متد setName که به name دسترسی داشت.

چرا getter و setter؟

استفاده از این روش مزیت های زیادی دارد، پنهان سازی داده ها و پیاده سازی آنها (داده ها همیشه انواع ساده ای مانند int نیستند)، ساده کردن تغییرات در خصوصیات - یک خصوصیت میتواند یک نمونه struct باشد که اکثر متغیرهای آنرا کلاس تعیین میکند و ما میخواهیم مصرف کننده کلاس فقط بخشی از خواص آنرا دستکاری کند - و بسیاری مزیت های دیگر. اگر هم فکر میکنید که میتوان ویژگی های ساده را به صورت public و بقیه را به صورت private پیاده سازی کرد، باید بگویم بهتر است یک روش ثابت و قبول شده داشته باشید تا اینکه بخواهید هر ویژگی را هر طور که خواستید پیاده سازی کنید.

آیا این تنها قالب است؟

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

صدا زدن اعضای خصوصی از خارج بدنه کلاس؟

امتحان کنید D:


در پایان، اگر همچنان سوالی دارید میتوانید در نظرات بگویید تا پاسخ دهم. موفق باشید.

  • علی رشیدی

++C

C++

شی گرایی

نظرات (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی