شی گرایی در سی پلاس

saalek110

Well-Known Member
PHP:
class person
{
    char name[20];
    int id;
public:
    void getdetails(){}
};
 
int main()
{
   person p1; // p1 is a object 
}
منبع
یک کلاس در برنامه فوق تعریف شده.
و در main یک شی از این کلاس تعریف شده.
کلاس شامل متغیرها و متدهایی(توابعی) است.
 

saalek110

Well-Known Member
سوال این است: کلاس چه مزایایی دارد؟ تابع مگر چه اشکالی داشت؟
آیا نمیشد داخل تابع متغیرهایی تعریف کرد و مثل کلاس ازش استفاده کرد؟

فعلا نمی خواهم وارد این بحث شوم. جواب سوال فوق بحث های پیچیده ای ایجاد می کند. که این پیچیدگی ما را از کار بازمی دارد. منظور از طرح سوال فوق به فکر واداشتن شما بود تا به ماهیت کلاس فکر کنید.

فعلا می خواهیم با کلاس و آبجکت آشنا شویم و ببینیم چه موارد استفاده ای دارد.
 

saalek110

Well-Known Member
کلاس یک قالب است و تا شی از آن ساخته نشود چیزی ساخته نشده. پس با نوشتن یک کلاس انتظار دیدن یک اتفاق را نداشته باشید.

از یک کلاس میشه آبجکت های زیادی ساخت.
در یک کارخانه از یک قالب میلیونها اسباب بازی تولید می شود.
 

saalek110

Well-Known Member
PHP:
#include <iostream>

using namespace std;

class Box {
   public:
      double length;   // Length of a box
      double breadth;  // Breadth of a box
      double height;   // Height of a box
};

int main() {
   Box Box1;        // Declare Box1 of type Box
   Box Box2;        // Declare Box2 of type Box
   double volume = 0.0;     // Store the volume of a box here
   // box 1 specification
   Box1.height = 5.0;
   Box1.length = 6.0;
   Box1.breadth = 7.0;

   // box 2 specification
   Box2.height = 10.0;
   Box2.length = 12.0;
   Box2.breadth = 13.0;

   // volume of box 1
   volume = Box1.height * Box1.length * Box1.breadth;
   cout << "Volume of Box1 : " << volume <<endl;

   // volume of box 2
   volume = Box2.height * Box2.length * Box2.breadth;
   cout << "Volume of Box2 : " << volume <<endl;
   return 0;
}
منبع
در برنامه بالا یک کلاس به نام جعبه تعریف شده. هنوز چیزی خلق نشده.

b1.png

و در main در همون اول برنامه آبجکتهای جعبه 1 و جعبه 2 تعریف شده.
بعد تعریف این دو آبجکت واقعا ما دو جعبه خلق کرده ایم.

box1.png

در مرحله بعد ابعاد دو جعبه داده شده.
و بعد ما می خواهیم حجم هر جعبه را تعیین کنیم. و حجم هر یک از دو جعبه را چاپ کرده ایم.
--------------------
می توانستیم از کلاس خود 3 جعبه یا 4 جعبه خلق کنیم و حجم هر یک از 4 جعبه را حساب کنیم. جعبه هایی با ابعاد متفاوت.

b4.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member
PHP:
#include <iostream>
using namespace std;

class human {
  public:
    string name;
    int age;
};

int main () {
  human exhibitA;

  exhibitA.name = "Michael";
  exhibitA.age = 25;

  cout <<"Exhibit A's Name is "<< exhibitA.name << endl;
  cout <<"Exhibit A's Age is "<< exhibitA.age << endl;

  return 0;
}
منبع
بحث تکراری است. چیز جدیدی ندارد.
یک کلاس انسان ساختیم. و بعد آبجکت exhibitA معرفی شده. و بعد نام و سن او تنظیم شده و بعد چاپ شده.
 

saalek110

Well-Known Member
تا اینجا شاید تعریف کردن کلاس و ساخت آبجکت از آن کاری عبث به نظر رسیده باشد.

بیایید مثال بهتری را مرور کنیم:
PHP:
#include <iostream>
using namespace std;

class human {
  public:
    string name;
    int age;

    void run () {
      cout << name <<" is running" << endl;
    }
};

int main () {
  human exhibitA;

  exhibitA.name = "Michael";
  exhibitA.run();

  return 0;
}
منبع
در این مثال کلاس ما علاوه بر نام و سن که متغیر بودند یک متد یا تابع هم دارد به نام run .
ولی به جای دویدن نوشته ((نام آبجکت .... در حال دویدن)) . چون احتمالا می خواسته مثال ساده باشد. ولی همه متدها که فقط کارشان نوشتن نیست. این فقط یک مثال است. در ادامه با مثالهای بهتری آشنا خواهیم شد.
در تابع main طبق روال قبلی باز آبجکتی از کلاس خلق شده و اول متغیری مقدار دهی شده و بعد متد آبجکت اجرا شده.
نتیجه اجرا می شود. ((میکاییل در حال دویدن است.))
m2.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member
a43.jpg
در بالا باز هم کلاسهایی داریم. ولی دیگه کدش را نمی نویسیم چون کاری تکراری است.
به کلاس ماشین نگاه کنید. کلاس جالبی است. مختصات محل ماشین جزو متغیرهای آن است. و همچنین سرعت. 3 متد move و park و accelerate هم دارد.

یا فرض کنید بخواهید بازی فوتبال بسازید. کلاس بازیکن فروتبال می سازید و بعد 11 آبجکت بازیکن ازش می سازید و هر بازیکن متدهای run و jump و kickball دارد. یعنی دویدن و پریدن و شوت زدن. پاس دادن هم میشد اضافه کرد و متدهای دیگر.

منبع
 

saalek110

Well-Known Member
تعریف متد کلاس
PHP:
// classes example
#include <iostream>
using namespace std;

class Rectangle {
    int width, height;
  public:
    void set_values (int,int);
    int area() {return width*height;}
};

void Rectangle::set_values (int x, int y) {
  width = x;
  height = y;
}

int main () {
  Rectangle rect;
  rect.set_values (3,4);
  cout << "area: " << rect.area();
  return 0;
}
منبع
در برنامه بالا کلاس متدی به نام set_values دارد و می بینید که چگونه بعد از کلاس این متد تعریف شده.
منظور این قسمت است:
PHP:
void Rectangle::set_values (int x, int y) {
  width = x;
  height = y;
}
به چهارنقطه دقت کنید:
PHP:
::
نام کلاس و بعد چهارنقطه و بعد نام متد. دوبار باید دو نقطه را بزنید.

حالا این متد کارش چیه؟
می بینید که ورودی های متد را ریخته در متغیرهای آبجکت.

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

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

شاید بگویید به جای ارسال 3 و 4 با این شیوه و بعد برگشت گرفتن با عذاب می آمدیم خودمان دو عدد را در هم ضرب می کردیم.....
ولی این فقط یک مثال است که نشان دهد متدها چه رابطه ای با متغیرها می توانند داشته باشند.

پس در این پست با روش تعریف متد بعد تعریف کلاس آشنا شدید
و یک نوع رابطه بین متدها و متغیرهای آبجکت ایجاد کردیم.
 

saalek110

Well-Known Member
PHP:
// example: one class, two objects
#include <iostream>
using namespace std;

class Rectangle {
    int width, height;
  public:
    void set_values (int,int);
    int area () {return width*height;}
};

void Rectangle::set_values (int x, int y) {
  width = x;
  height = y;
}

int main () {
  Rectangle rect, rectb;
  rect.set_values (3,4);
  rectb.set_values (5,6);
  cout << "rect area: " << rect.area() << endl;
  cout << "rectb area: " << rectb.area() << endl;
  return 0;
}
این هم همان مثال قبلی است ولی از کلاس به جای یک آبجکت دو آبجکت خلق شده.
باز ابعاد با متد ارسال شده.و نه مقداردهی مستقیم متغیرها.
مثل این است از یک الگو دو پیراهن بدوزیم.
 

saalek110

Well-Known Member
اختفای متغیرها:

در مثال قبلی متغیرها گویی در جایی مخفی و محفوظ بودند و ما از طریق متدها با متغیرها رابطه داشتیم.
من در code::blocks برنامه اولی را درج کردیم. بعد خلق آبجکت و نوشتن نام آبجکت و زدن دکمه نقطه شمای زیر را داریم:
c12.jpg
جلوی متغیرها علامت قرمز زده و در کادر نوشته private
یعنی این متغیر عمومی public نیست. چون در تعریف کلاس هم می بینید کلمه public قبل متغیرها ذکر نشده.

پس راز اختفا این بود. نبودن کلمه public قبل متغیرها.
و برای همین بود از متدها برای مقدار دهی آنها استفاده شده.و نه مقدار دهی مستقیم.
---------------------

من نوشتم:
PHP:
 rect.height=7;
ولی برنامه اجرا نشد و اررور داد:
PHP:
int Rectangle::height' is private|
پس کامپایلر هم به قوانین کلاس احترام می گذارد و به شما اجازه نمی دهد قوانین آن را بشکنید!

guard.png

---------------------
کمی فکر کنید!

این مخفی بودن چه فوایدی دارد؟ متغیر مخفی یا متد مخفی.

فرض کنید قصری هست که بعضی جاهای آن ممنوعه است.

palaces.jpg

 
آخرین ویرایش:

saalek110

Well-Known Member
پس تا اینجا با طرز تعریف کردن کلاس و
طرز ساختن آبجکت
و کار با متغیرها و متدهای آبجکت آشنا شدیم.
پست های بالا را مقداری مرور کنید و مسلط شوید تا بتوانیم وارد مباحث بعدی بشویم.

start1.jpg
 

saalek110

Well-Known Member
فواید شی گرایی و بقیه مباحث مثل توارث:
کلاس از تعدادی تابع و متغیر تشکیل شده. اینکه تا کجا کارایی دارد بسته به استفاده کننده اش است.
به نظر من نمیشه فواید چیزی را لیست کرد. چون ممکنه بعدا استفاده های جدیدی از یک چیز بشود.
و درک و توانایی هر فرد تعیین می کند که فواید یک چیز را چه بداند.
این نظر فعلی من بود. شما هم نظر خود را بنویسید.

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

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

در مورد برنامه نویسی فروم های خارجی خوبی هستند که تقریبا هر چیزی در آنها بحث شده. مثل stackoverflow
با این مقدمه قسمتی از یک کتابچه و خود کتابچه را پست می کنم.
مطالعه مطالب و کتابهای انگلیسی این تاپیک اجباری نیست. یعنی نخواندن آنها لطمه ای به فهم ادامه مطالب نمی زند. برای علاقه مندان است.



oop.jpg
c1.jpg c2.jpg
 

پیوست ها

  • OOP with C Plus.rar
    483.1 کیلوبایت · بازدیدها: 0
آخرین ویرایش:

جدیدترین ارسال ها

بالا