شما اینجا هستید

خانه

برنامه نویسی شی گرا ( قسمت دوم)

 

سلام. امروز قصد دارم باز هم درباره برنامه نویسی شی گرا و مفاهیم این نوع برنامه نویسی بیشتر صحبت کنم.

قبلا متوجه شدیم که توسط اشیا می توانیم در واقع متغیر های جدید به زبان برنامه نویسی اضافه کنیم. متغیر هایی که مفهوم فیزیکی یا ذهنی دارند. مثلا متغیری از جنس شی  ماشین ، ماتریس، بردار و ... در واقع هر چه که در ذهن ما وجود داشته باشد می تواند یک شی یا کلاس باشد. در این قسمت نحوه تعریف یک کلاس در زبان C++ را نشان می دهم:

class Student {

};

با استفاده از کد بالا شما می توانید یک کلاس به نام Student تعریف کنید. ولی این کلاس هیچ خاصیت یا متدی ندارد و فقط یک کلاس جدید محسوب می شود. برای استفاده از این کلاس می توانید همان طور که متغیر های دیگر را تعریف می کنید، یک شی تعریف کنید:

int x;
double d2;
Student st1;
Student st2;

در مثال بالا st1 و st2 دو شی از جنس Student هستند. ( همانطور که d2 از جنس double و x از جنس int است)

توجه کنید که واژه کلاس(class) به نوع متغیر اتلاق می شود و شی (object) به نمونه ای از آن متغیر که حافظه اشغال کرده است می گویند. یعنی در این جا  Student کلاس و st1 شی است.

 شما می توانید به کلاسی که تعریف کرده اید خواص جدیدی اضافه کنید. مثلا Student می تواند خواصی مثل شماره دانشجویی، نام، فامیلی، تعداد واحد گذرانده، معدل و ... داشته باشد.  مثلا من این خواص را به کلاس Student اضافه می کنم:

 

class Student {

int number;
string name;
string family_name;
int passed_units;
double average_grade;

};

 

در کد های بالا خواص جدید از نوع متغیر های پیش فرض C++ (مثل int, double و .. ) و متغیر string (که خود یک کلاس در کتابخانه stl است) اضافه کردم که به کلاس Student مفهوم یک کلاس از نوع " دانشجو" می دهد.
شما می توانید هر خاصیت جدید را که مد نظر دارید به این کلاس اضافه کنید تا مفهوم و کاربرد بیشتری به آن بدهید. 

نکته بعدی در مورد کلاس این است که چه گونه به خاصیت های کلاس دسترسی پیدا کنیم. برای مثال می خواهیم که دانشجو به نام خاصی ایجاد کنیم و اطلاعات آن را تکمیل کنیم و نمایش دهیم. برای این منظور تابعی ایجاد می کنیم که یک متغیر از نوع Student دریافت می کند و آن را نمایش دهد:

// sample function to print student information
void print_student_information( Student  st )  {

cout << "Student Number: " << st.number << "\t"
  << "Name: " << st.name << st.family_name << "\n"
<< "Average grade: " << st.average_grade << "\n";

}

در کدهای بالا مشاهده می کنید که برای دسترسی به خاصیت های یک شی از عملگر نقطه (.) استفاده می کنیم.  بعد از نام شی مورد نظر با تایپ نقطه معمولا محیط های برنامه نویسی لیستی از اعضای کلاس را برای راحتی کار شما نمایش می دهند. تابع print_student_information یک ورودی از جنس Student به نام st دریافت می کند و برخی از خواص آن را در صفحه کنسول نمایش می دهد. حال در کدهای زیر تابع بالا را فراخوانی می کنیم:

Student student1;

student1.number = 88103456;
student1.name = "Reza";
student1.family_name = "Rezaie";
student1.passed_units = 144;
student1.average_grade = 16.2;
 

print_student_information (student1);
 

در کد های بالا ابتدا یک شی به نام student1 ایجاد کردیم. سپس با استفاده از نقطه (.) کلیه خواص این شی (data members یا data fields) را مقدار دهی کردیم. سپس تابع print_student_information را فراخوانی کردیم تا اطلاعات این شی را چاپ کند.

نکته دیگر در کلاس ها سطح دسترسی به اعضای کلاس ها است. اگر کد فوق را در کامپایلر C++ اجرا کنید قطعا پیغام خطای مبنی براین که "اعضای کلاس Student قابل دسترسی نیستند" به شما خواهد داد. زیرا در C++ هر عضو کلاس می تواند public یا private یا protected باشد. وقتی یک عضو public باشد می توان توسط عملگر نقطه به اعضای آن دسترسی پیدا کرد (در بیرون از کلاس). در صورتی که private یا protected باشد نمی توان در خارج از کلاس به آن دسترسی داشت. توضیح بیشتر این مفهموم را در پست دیگری بیان خواهم کرد. ولی برای اجرا شدن کدهای بالا کلمه public را در کلاس به این صورت قرار می دهیم تا بتوان به اعضای آن دسترسی پیدا کرد:

 

class Student {

      public:

int number;
string name;
string family_name;
int passed_units;
double average_grade;

};

 

 

آن چه که در این جا قابل تامل است، این است که تک تک فیلد ها یا خاصیت ها باید جدا مقدار دهی شوند و در زمان استفاده هم، هر کدام جدا توسط نقطه مورد استفاده قرار می گیرند. آن چه که ما در واقع در این جا انجام داده ایم کپسوله کردن داده ها در یک مفهوم جدید به نام Student است. این در حالی است که ما می توانستیم هرکدام از متغیر ها را جدا بدون تعریف کلاس نیز مقدار دهی کرده و استفاده کنیم ولی در آن صورت هیچ مفهومی به نام "دانشجو" نداشتیم. کپسوله کردن داده ها ( data encapsulation) اولین خاصیت برنامه نویسی شی گرا است که  در این بخش شما با آن آشنا شدید. کپسوله کردن داده ها یعنی کنار هم قرار دادن متغیرهای موجود و ایجاد یک تعریف جدید. مثل کلاس Student که از متغیر های موجود int و double و string ایجاد شده است. 2 خاصیت مهم دیگر در برنامه نویسی شی گرا به نام وراثت (inheritance) و چندشکلی بودن( polymorphism) نیز وجود دارد که در درس های بعدی بررسی خواهیم کرد.

برای پایان این درس نیز مقایسه بین حالت کپسوله کردن داده ها و کپسوله نکردن آن را با مثال نشان می دهم:

تصور کنید برای مثال بالا در متن درس، بخواهیم 10 دانشجو ایجاد کرده و اطلاعات آن ها را چاپ کنیم، در این صورت می توانیم کد زیر را اجرا کنیم:

 

 

 const int students_count = 10;
  Student students[students_count];
  for (int i=0; i< students_count; i++) {
    students[i].number = i;
    students[i].name = "Test Name";
    students[i].family_name = "Family Name";
    students[i].passed_units = 144;
    students[i].average_grade = 15.2;
  }
  
  for (int i=0; i< students_count; i++) { 
   print_student_information(students[i]);
  }

 

کد بالا یک آرایه 10 تایی از Student به نام students ایجاد می کند و همه آن ها به صورت یکسان مقدار دهی می کند. سپس در یک حلقه دیگر تابع print_student_information را 10 بار فراخوانی کرده و هر بار یکی از Student ها را برای چاپ می فرستد. در ادامه همین عملیات را بدون تعریف کلاس Student انجام می دهیم:

 

 

 int students_number[ students_count ]; 
  string students_name[ students_count ];
  string students_family_name[ students_count ];
  int students_passed_units[ students_count ];
  double students_average_grade[ students_count ];
 
  for (int i=0; i< students_count; i++) {
    students_number[i] = i;
    students_name[i] = "Test Name";
    students_family_name[i] = "Family Name";
    students_passed_units[i] = 144;
    students_average_grade[i] = 15.2;
  }
 
   for (int i=0; i< students_count; i++) { 
     print_student_information( students_number[i], students_name[i],
      students_family_name[i], students_passed_units[i], students_average_grade[i]);
   }

 

در کدهای بالا هر کدام از خاصیت های name و family_name و ... به طور مجزا در یک آرایه ذخیره شده است. و برای چاپ آن باید به تابع print_student_information  هر 5 خاصیت را پاس کنید در صورتی که در حالت کپسوله شده فقط یک شی از جنس Student پاس می شد. تصور کنید که برنامه شما دارای تابع های فراوانی باشد که با اطلاعات "دانشجو" سروکار دارد. در این صورت شما باید به همه آن توابع، تمام 5 خاصیت را پاس کنید ( ممکن است خاصیت ها خیلی بیشتر هم باشند.) در صورتی که اگر کلیه خواص (یا داده ها) در کلاسی به نام Student کپسوله شده باشد، به تمامی توابع مورد نیاز فقط شی Student را پاس خواهید کرد. وجود مفهوم یا متغیر Student به شما کمک می کند که داده های مربوط به یک Student در یک بلوک با مفهوم "دانشجو" ذخیره شده باشند تا این که هر کدام جدا گانه در آرایه های مختلف باشند.

این در حالی است که از کلاس های تعریف شده در کلاس های جدید هم می توان استفاده کرد و کلاس ها به صورت تودرتو از یکدیگر استفاده می کنند. ( مثل string که یک کلاس از پیش تعریف شده است و ما در این جا به عنوان خاصیت از آن استفاده کردیم.) در نتیجه اگر داده ها کپسوله نباشند کار کردن با آنها به مراتب سخت تر و سخت تر می شود و شما باید آرایه ها و متغیر های زیادی ایجاد کرده و تعداد آرگومان های توابع به سرعت زیاد می شوند. طوری که  هرچه برنامه شما کد بیشتری داشته باشد، نامفهوم تر و گنگ تر می شود. در صورتی که استفاده از مفاهیمی که با ذهن بیشتر مانوس هستند ( در این جا "دانشجو") کد را خوانا تر می کند و حجم کد ها کم تر می شود.

می توانید کد های مربوط به این درس را از این جا دانلود کنید. ( توسط برنامه Visual Studio 2008 به بعد می توانید پروژه را اجرا کنید.)

امیدوارم مفهموم کپسوله شدن و تعریف Class را به درستی منتقل کرده باشم. در درس بعدی دیگر خاصیت های برنامه نویسی شی گرا را بررسی خواهیم نمود.

موفق و پیروز باشید.

 

دیدگاه‌ها

با سلام اول باید از شما تشکر کنم بابت وب سایت زیباتون سوالی داشتم چه جوری میتونم کلاسی ایجاد کرده و سپس از خود فرد اطلاعات رو بگیرم تمام تکس رو خوندم اما متوجه نشدم  برای مثال کلاسی برای n دانش آموز که نمره و درس مربوطه را بگیرد وپایین ترین را نشان دهد لطفا سریع تر پاسخ دهید خیلی برام مهمه لطفا به ایمیلم بفرستید painteramir@yahoo.com

به زبان شی گرا برنامه ای بنویسید که 2 عدد n رقمی را دریافت نماید و سپس جمع,ضرب,تقسیم و تفریق این 2 عدد را انجام دهد

سلام دوست من ممنون از سايت خيلي عالي و پربارت

 

اگه ممكنه نحوه نوشتم كلاس كار برنامه نويسي رو برام توضيح بده مثلا ميخواهيم برنامه كتابخانه رو بنويسيم چطور بايد كلاس آن را بنويسم اگه ممكنه يه نمونه نوشتن كلاس برنامه كتابخانه رو بنويسيد تا بهتر بتونم درك كنم با تشكر و سپاس فراوان اگه زحمتي نيست ايميل منه برام ميل كنيد كه شرمنده روي ماهتون ميشم mehdi_s_1613@yahoo.com

سلام خسته نباشین میخوام ازتوتن تشکر کنم بابت سایتتون

یه سوال داشتم

اونم این که من کلاس رو تعریف کرددم بعد میخوام اطلاعات دانشجو رو در تابع به نام input  دریافت کنم

اما نمیشه یا من بلد نیستم اگه میشه کمک کنین ممنون میشم

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

 

افزودن نظر جدید

درباره من

سلام. به وب سایت شخصی من خوش آمدید.

محمد ذات خواهی هستم متولد سال 66 اهل رشت. سال 89 از دانشگاه شریف با مدرک لیسانس مهندسی شیمی و سال 91 از دانشگاه علم و صنعت ایران با مدرک ارشد کنترل و شبیه سازی فرایند فارغ التحصیل شدم، و در حال حاضر به عنوان مهندس نرم افزار در شرکت گسترش فرایند شریف هستم. از اونجایی که از دبیرستان به الگوریتم و برنامه نویسی علاقه داشتم از همون موقع تو این حیطه کار می کنم. بیشترین توانایی من در طراحی نرم افزار های مهندسی شیمی، طراحی وب و کلا کد نویسی هست. خوش حال میشم بتونم به دیگران کمک کنم خصوصا در حوزه آموزش. سعی می کنم تو این وب سایت مطالب و تجربه هایی که فکر می کنم به درد علاقه مندان به حوزه نرم افزار و برنامه نویسی بخوره قرار بدم. امیدوارم شما هم با نظرات و انتقادات و بحث های علمی تون در ارتقای محتوی علمی این وب سایت من رو یاری کنید.

 

Mohammad Zatkhahi Image

 

.

?>