مضى على الشبكة و يوم من العطاء.

البرمجة الكائنية (oop) examples

Sadell_AliSadell_Ali is verified member.

الرقابة والتنظيم
.:: الرقابة والتنظيم ::.

السمعة:

تم بحمد الله معرفة مفاهيم ال class و struct أما الان سيتم أخذ أمثلة أكثر لمعرفة أفكار جديدة وممارسة الذي تم أخذه في السابق فالنبدأ

المثال الأول => حول كيفية تعريف دالة تأخذ كائن من كلاس كبراميتر , في هذا المثال قمنا بتعريف كلاس إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, اسم المؤلف, سعره و عدد صفحاته.
بعدها قمنا بتعريف دالة إسمها printInfo عند استدعاءها نمرر لها كائن نوعه Book فتقوم بطباعة قيمه بشكل مرتب.
في الأخير قمنا بإنشاء كائن من Book و إعطاؤه قيم, و من ثم تمريره للدالة printInfo() حتى تقوم بطباعة قيمه
كود:
#include <iostream>
using namespace std;
// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {
public:
    string title;
    string author;
    double price;
    int numberOfPages;
};
// فتقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها نمرر لها كائن من printInfo هنا قمنا بتعريف دالة إسمها
void printInfo(Book book)
{
    cout << "Title: " << book.title << "\n";
    cout << "Author: " << book.author << "\n";
    cout << "Price: " << book.price << "$\n";
    cout << "Number of pages: " << book.numberOfPages << "\n";
}
// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;
    // book هنا قمنا بإعطاء قيم لمتغيرات الكائن
    book.title = "C++ for beginners";
    book.author = "Mhamad Harmush";
    book.price = 9.99;
    book.numberOfPages = 420;
  
    // لها حتى تقوم بطباعة القيم الموجودة فيه book و تمرير الكائن printInfo() هنا قمنا باستدعاء الدالة
    printInfo(book);
    return 0;
}
إذًا فالمختلف في هذا المثال أننا قمنا بتمرير براميتر " كائن" Book للدالة , فكان الناتج هو التالي 👇
كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420

المثال الثاني=> حول التفرقة بين براميترات الدوال و خصائص الكلاس
قبل البدء بالمثال يجب علينا معرفة المعلومة التالية أنه يوجد شيء يسمى العامل "this-> "This Pointer حيث يستخدم للتفرقة بين براميترات الدوال و الخصائص الموجودة في الكلاس مما يجعلك قادر على وضع نفس الأسماء للبارميترات و الخصائص و تجنب حدوث أي أخطاء منطقية بسبب الأسماء المتشابهة

في هذا المثال قمنا بتعريف كلاس اسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, اسم المؤلف, سعره و عدد صفحاته.
وتم تعريف دالة تسمى setTitle() عند استدعاءها نمرر لها نص فيتم وضعه كعنوان للكائن الذي قام باستدعائها

كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير t نمرر لها قيمة مكان الباراميتر
    void setTitle(string t)
    {
        title = t;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
  
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
  
    return 0;
}
حيث ستكون نتيجة الكود السابق 👇

كود:
Title: C++ for beginners
أما في حال قمنا بإعادة المثال السابق مع إجراء تعديل بسيط عليه بحيث نجعل إسم الباراميتر الموضوع في الدالة setTitle() هو نفسه اسم المتغير title الموجود في الكلاس
سيظهر لنا مشكلة منطقية عند تشغيل البرنامج
مثال =>
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // title نمرر لها قيمة مكان الباراميتر  Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    void setTitle(string title)
    {
        // الموجود في الكلاس title بداخله من جديد. أي لن يتم تمريرها للمتغير title هنا كأننا قلنا, أعد وضع القيمة التي نمررها للباراميتر
        // لأنهما يملكان نفس الإسم title سبب هذه المشكلة أن المترجم لن يعرف أنك تقصد أنك تريد تمرير القيمة التي تمررها للدالة, إلى المتغير
        title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
  
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
  
    return 0;
}
سنحصل على أن القيمة التي مررناها للدالة setTitle() لم يتم تمريرها للمتغير title الموجود في الكائن book و هذا ما كنا نقصده بخطأ منطقي
كود:
Title:
فلحل المشكلة المنطقية التي شاهدناها في المثال , أي لجعل المترجم قادر على التفرقة بين البارميترات و المتغيرات الموجودة في الكلاس
سنستخدم العامل this-> كلما أردنا الإشارة إلى المتغيرات الموجودة في الكلاس
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير title نمرر لها قيمة مكان الباراميتر
    void setTitle(string title)
    {
        this->title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
  
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
  
    return 0;
}
ستكون النتيجة هي :
كود:
Title: C++ for beginners
وهو المطلوب🤝

المثال الرابع=> في هذا المثال سنكون بحاجة الى معرفة مفهوم الـ Constructor
الكونستركتور ( Constructor ) و الذي هو عبارة عن دالة, يتم إستدعائها أثناء إنشاء كائن من الكلاس لإعطاء قيم أولية للخصائص الموجودة فيه
أيّ كلاس تقوم بتعريفه, يملك كونستركتور افتراضي:) حتى لو تقم بتعريفه بنفسك و سبب ذلك أنه لا يمكن إنشاء كائن من كلاس إلا من خلال كونستركتور هذا الكلاس.
لهذا إن لم تقم بتعريف كونستركتور للكلاس بنفسك, فكن على يقين أن مترجم لغة C++ سيقوم بإنشاء كونستركتور افتراضي فارغ بدلاً عنك عندما تحاول إنشاء كائن من الكلاس
فالقاعدة الأساسية عند تعريف كونستركتور هي أنه يجب أن يحمل نفس اسم الكلاس و يكون نوعه public
وأخيرًا أننا نستطيع تعريف أكثر من كونستركتور
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // هنا قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه
    Book(string title, string author, double price, int numberOfPages)
    {
        // هنا قمنا بوضع القيم التي نمررها للكونستركتور بالترتيب في خصائص الكائن
        this->title = title;
        this->author = author;
        this->price = price;
        this->numberOfPages = numberOfPages;
    }

    // تقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها من أي كائن ننشئه من printInfo هنا قمنا بتعريف دالة إسمها
    void printInfo()
    {
        cout << "Title: " << title << "\n";
        cout << "Author: " << author << "\n";
        cout << "Price: " << price << "$\n";
        cout << "Number of pages: " << numberOfPages << "\n";
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // مع تمرير القيم التي نريد وضعها فيه بشكل مباشر من خلال الكونستركتور book إسمه Book هنا قمنا بتعريف كائن من
    Book book("C++ for beginners", "Mhamad Harmush", 9.99, 420);

    // حتى تقوم بطباعة القيم الموجودة فيه book من الكائن printInfo() هنا قمنا باستدعاء الدالة
    book.printInfo();

    return 0;
}
في هذا المثال , قمنا بتعريف كلاس اسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
في الكلاس Book قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه يمكننا من خلاله إدخال قيم مباشرةً للخصائص الموجودة في أي كائن ننشئه من الكلاس.
كما أننا قمنا بتعريف دالة اسمها printInfo() عند استدعاءها تقوم بطباعة قيم الخصائص التي يمكلها أي كائن ننشئه من الكلاس
النتيجة لآخر مثال 😊

كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420
🌸يعطيكم العافية🌸

دروس البرمجة الكائنية
 
التعديل الأخير بواسطة المشرف:
تم بحمد الله معرفة مفاهيم ال class و struct أما الان سيتم أخذ أمثلة أكثر لمعرفة أفكار جديدة وممارسة الذي تم أخذه في السابق فالنبدأ
المثال الأول => حول كيفية تعريف دالة تأخذ كائن من كلاس كبراميتر
في هذا المثال , قمنا بتعريف كلاس إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
بعدها قمنا بتعريف دالة إسمها printInfo عند استدعاءها نمرر لها كائن نوعه Book فتقوم بطباعة قيمه بشكل مرتب.
في الأخير قمنا بإنشاء كائن من Book و إعطاؤه قيم, و من ثم تمريره للدالة printInfo() حتى تقوم بطباعة قيمه
كود:
#include <iostream>
using namespace std;
// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {
public:
    string title;
    string author;
    double price;
    int numberOfPages;
};
// فتقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها نمرر لها كائن من printInfo هنا قمنا بتعريف دالة إسمها
void printInfo(Book book)
{
    cout << "Title: " << book.title << "\n";
    cout << "Author: " << book.author << "\n";
    cout << "Price: " << book.price << "$\n";
    cout << "Number of pages: " << book.numberOfPages << "\n";
}
// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;
    // book هنا قمنا بإعطاء قيم لمتغيرات الكائن
    book.title = "C++ for beginners";
    book.author = "Mhamad Harmush";
    book.price = 9.99;
    book.numberOfPages = 420;
   
    // لها حتى تقوم بطباعة القيم الموجودة فيه book و تمرير الكائن printInfo() هنا قمنا باستدعاء الدالة
    printInfo(book);
    return 0;
}
اذا فالمختلف في هذا المثال أننا قمنا بتمرير براميتر " كائن" Book للدالة
فكان الناتج هو التالي 👇
كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420
المثال الثاني=> حول التفرقة بين براميترات الدوال و خصائص الكلاس
قبل البدء بالمثال يجب علينا معرفة المعلومة التالية أنه يوجد شيء يسمى العامل "this-> "This Pointer حيث يستخدم للتفرقة بين براميترات الدوال و الخصائص الموجودة في الكلاس مما يجعلك قادر على وضع نفس الأسماء للبارميترات و الخصائص و تجنب حدوث أي أخطاء منطقية بسبب الأسماء المتشابهة

في هذا المثال قمنا بتعريف كلاس إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
وتم تعريف دالة تسمى setTitle() عند استدعاءها نمرر لها نص فيتم وضعه كعنوان للكائن الذي قام باستدعائها

كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
   
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير t نمرر لها قيمة مكان الباراميتر
    void setTitle(string t)
    {
        title = t;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
   
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
   
    return 0;
}
حيث ستكون نتيجة الكود السابق 👇

كود:
Title: C++ for beginners
أما في حال قمنا بإعادة المثال السابق مع إجراء تعديل بسيط عليه بحيث نجعل إسم الباراميتر الموضوع في الدالة setTitle() هو نفسه إسم المتغير title الموجود في الكلاس
سيظهر لنا مشكلة منطقية عند تشغيل البرنامج
مثال =>
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
   
    // title نمرر لها قيمة مكان الباراميتر  Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    void setTitle(string title)
    {
        // الموجود في الكلاس title بداخله من جديد. أي لن يتم تمريرها للمتغير title هنا كأننا قلنا, أعد وضع القيمة التي نمررها للباراميتر
        // لأنهما يملكان نفس الإسم title سبب هذه المشكلة أن المترجم لن يعرف أنك تقصد أنك تريد تمرير القيمة التي تمررها للدالة, إلى المتغير
        title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
   
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
   
    return 0;
}
سنحصل على أن القيمة التي مررناها للدالة setTitle() لم يتم تمريرها للمتغير title الموجود في الكائن book و هذا ما كنا نقصده بخطأ منطقي
كود:
Title:
فلحل المشكلة المنطقية التي شاهدناها في المثال , أي لجعل المترجم قادر على التفرقة بين البارميترات و المتغيرات الموجودة في الكلاس
سنستخدم العامل this-> كلما أردنا الإشارة إلى المتغيرات الموجودة في الكلاس
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
   
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير title نمرر لها قيمة مكان الباراميتر
    void setTitle(string title)
    {
        this->title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
   
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
   
    return 0;
}
ستكون النتيجة هي :
كود:
Title: C++ for beginners
وهو المطلوب🤝
المثال الرابع=> في هذا المثال سنكون بحاجة الى معرفة مفهوم ال Constructor
الكونستركتور ( Constructor ) و الذي هو عبارة عن دالة, يتم إستدعائها أثناء إنشاء كائن من الكلاس لإعطاء قيم أولية للخصائص الموجودة فيه
أيّ كلاس تقوم بتعريفه, يملك كونستركتور إفتراضي:) حتى لو تقم بتعريفه بنفسك و سبب ذلك أنه لا يمكن إنشاء كائن من كلاس إلا من خلال كونستركتور هذا الكلاس.
لهذا إن لم تقم بتعريف كونستركتور للكلاس بنفسك, فكن على يقين أن مترجم لغة C++ سيقوم بإنشاء كونستركتور إفتراضي فارغ بدلاً عنك عندما تحاول إنشاء كائن من الكلاس
فالقاعدة الأساسية عند تعريف كونستركتور هي أنه يجب أن يحمل نفس إسم الكلاس و يكون نوعه public
وأخيرا أننا نستطيع تعريف أكثر من كونستركتور
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
   
    // هنا قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه
    Book(string title, string author, double price, int numberOfPages)
    {
        // هنا قمنا بوضع القيم التي نمررها للكونستركتور بالترتيب في خصائص الكائن
        this->title = title;
        this->author = author;
        this->price = price;
        this->numberOfPages = numberOfPages;
    }

    // تقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها من أي كائن ننشئه من printInfo هنا قمنا بتعريف دالة إسمها
    void printInfo()
    {
        cout << "Title: " << title << "\n";
        cout << "Author: " << author << "\n";
        cout << "Price: " << price << "$\n";
        cout << "Number of pages: " << numberOfPages << "\n";
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // مع تمرير القيم التي نريد وضعها فيه بشكل مباشر من خلال الكونستركتور book إسمه Book هنا قمنا بتعريف كائن من
    Book book("C++ for beginners", "Mhamad Harmush", 9.99, 420);

    // حتى تقوم بطباعة القيم الموجودة فيه book من الكائن printInfo() هنا قمنا باستدعاء الدالة
    book.printInfo();

    return 0;
}
في هذا المثال , قمنا بتعريف كلاس إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
في الكلاس Book قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه يمكننا من خلاله إدخال قيم مباشرةً للخصائص الموجودة في أي كائن ننشئه من الكلاس.
كما أننا قمنا بتعريف دالة إسمها printInfo() عند استدعاءها تقوم بطباعة قيم الخصائص التي يمكلها أي كائن ننشئه من الكلاس
النتيجة لأخر مثال 😊

كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420
🌸يعطيكم العافية🌸
بارك الله فيك يا سديل على هذا الطرح الرائع والله يعطيك الف عافيه
رح اقرأ الموضوع وان وجدت اي استفسارات برجعلك 🌹
 
بارك الله فيك يا سديل على هذا الطرح الرائع والله يعطيك الف عافيه
رح اقرأ الموضوع وان وجدت اي استفسارات برجعلك 🌹
الله يعافيك 🙏🏻
 
تم بحمد الله معرفة مفاهيم ال class و struct أما الان سيتم أخذ أمثلة أكثر لمعرفة أفكار جديدة وممارسة الذي تم أخذه في السابق فالنبدأ

المثال الأول => حول كيفية تعريف دالة تأخذ كائن من كلاس كبراميتر , في هذا المثال قمنا بتعريف كلاس إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, اسم المؤلف, سعره و عدد صفحاته.
بعدها قمنا بتعريف دالة إسمها printInfo عند استدعاءها نمرر لها كائن نوعه Book فتقوم بطباعة قيمه بشكل مرتب.
في الأخير قمنا بإنشاء كائن من Book و إعطاؤه قيم, و من ثم تمريره للدالة printInfo() حتى تقوم بطباعة قيمه
كود:
#include <iostream>
using namespace std;
// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {
public:
    string title;
    string author;
    double price;
    int numberOfPages;
};
// فتقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها نمرر لها كائن من printInfo هنا قمنا بتعريف دالة إسمها
void printInfo(Book book)
{
    cout << "Title: " << book.title << "\n";
    cout << "Author: " << book.author << "\n";
    cout << "Price: " << book.price << "$\n";
    cout << "Number of pages: " << book.numberOfPages << "\n";
}
// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;
    // book هنا قمنا بإعطاء قيم لمتغيرات الكائن
    book.title = "C++ for beginners";
    book.author = "Mhamad Harmush";
    book.price = 9.99;
    book.numberOfPages = 420;
 
    // لها حتى تقوم بطباعة القيم الموجودة فيه book و تمرير الكائن printInfo() هنا قمنا باستدعاء الدالة
    printInfo(book);
    return 0;
}
إذًا فالمختلف في هذا المثال أننا قمنا بتمرير براميتر " كائن" Book للدالة , فكان الناتج هو التالي 👇
كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420

المثال الثاني=> حول التفرقة بين براميترات الدوال و خصائص الكلاس
قبل البدء بالمثال يجب علينا معرفة المعلومة التالية أنه يوجد شيء يسمى العامل "this-> "This Pointer حيث يستخدم للتفرقة بين براميترات الدوال و الخصائص الموجودة في الكلاس مما يجعلك قادر على وضع نفس الأسماء للبارميترات و الخصائص و تجنب حدوث أي أخطاء منطقية بسبب الأسماء المتشابهة

في هذا المثال قمنا بتعريف كلاس اسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, اسم المؤلف, سعره و عدد صفحاته.
وتم تعريف دالة تسمى setTitle() عند استدعاءها نمرر لها نص فيتم وضعه كعنوان للكائن الذي قام باستدعائها

كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
 
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير t نمرر لها قيمة مكان الباراميتر
    void setTitle(string t)
    {
        title = t;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
 
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
 
    return 0;
}
حيث ستكون نتيجة الكود السابق 👇

كود:
Title: C++ for beginners
أما في حال قمنا بإعادة المثال السابق مع إجراء تعديل بسيط عليه بحيث نجعل إسم الباراميتر الموضوع في الدالة setTitle() هو نفسه اسم المتغير title الموجود في الكلاس
سيظهر لنا مشكلة منطقية عند تشغيل البرنامج
مثال =>
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
 
    // title نمرر لها قيمة مكان الباراميتر  Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    void setTitle(string title)
    {
        // الموجود في الكلاس title بداخله من جديد. أي لن يتم تمريرها للمتغير title هنا كأننا قلنا, أعد وضع القيمة التي نمررها للباراميتر
        // لأنهما يملكان نفس الإسم title سبب هذه المشكلة أن المترجم لن يعرف أنك تقصد أنك تريد تمرير القيمة التي تمررها للدالة, إلى المتغير
        title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
 
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
 
    return 0;
}
سنحصل على أن القيمة التي مررناها للدالة setTitle() لم يتم تمريرها للمتغير title الموجود في الكائن book و هذا ما كنا نقصده بخطأ منطقي
كود:
Title:
فلحل المشكلة المنطقية التي شاهدناها في المثال , أي لجعل المترجم قادر على التفرقة بين البارميترات و المتغيرات الموجودة في الكلاس
سنستخدم العامل this-> كلما أردنا الإشارة إلى المتغيرات الموجودة في الكلاس
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
 
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير title نمرر لها قيمة مكان الباراميتر
    void setTitle(string title)
    {
        this->title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
 
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
 
    return 0;
}
ستكون النتيجة هي :
كود:
Title: C++ for beginners
وهو المطلوب🤝

المثال الرابع=> في هذا المثال سنكون بحاجة الى معرفة مفهوم الـ Constructor
الكونستركتور ( Constructor ) و الذي هو عبارة عن دالة, يتم إستدعائها أثناء إنشاء كائن من الكلاس لإعطاء قيم أولية للخصائص الموجودة فيه
أيّ كلاس تقوم بتعريفه, يملك كونستركتور افتراضي:) حتى لو تقم بتعريفه بنفسك و سبب ذلك أنه لا يمكن إنشاء كائن من كلاس إلا من خلال كونستركتور هذا الكلاس.
لهذا إن لم تقم بتعريف كونستركتور للكلاس بنفسك, فكن على يقين أن مترجم لغة C++ سيقوم بإنشاء كونستركتور افتراضي فارغ بدلاً عنك عندما تحاول إنشاء كائن من الكلاس
فالقاعدة الأساسية عند تعريف كونستركتور هي أنه يجب أن يحمل نفس اسم الكلاس و يكون نوعه public
وأخيرًا أننا نستطيع تعريف أكثر من كونستركتور
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
 
    // هنا قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه
    Book(string title, string author, double price, int numberOfPages)
    {
        // هنا قمنا بوضع القيم التي نمررها للكونستركتور بالترتيب في خصائص الكائن
        this->title = title;
        this->author = author;
        this->price = price;
        this->numberOfPages = numberOfPages;
    }

    // تقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها من أي كائن ننشئه من printInfo هنا قمنا بتعريف دالة إسمها
    void printInfo()
    {
        cout << "Title: " << title << "\n";
        cout << "Author: " << author << "\n";
        cout << "Price: " << price << "$\n";
        cout << "Number of pages: " << numberOfPages << "\n";
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // مع تمرير القيم التي نريد وضعها فيه بشكل مباشر من خلال الكونستركتور book إسمه Book هنا قمنا بتعريف كائن من
    Book book("C++ for beginners", "Mhamad Harmush", 9.99, 420);

    // حتى تقوم بطباعة القيم الموجودة فيه book من الكائن printInfo() هنا قمنا باستدعاء الدالة
    book.printInfo();

    return 0;
}
في هذا المثال , قمنا بتعريف كلاس اسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
في الكلاس Book قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه يمكننا من خلاله إدخال قيم مباشرةً للخصائص الموجودة في أي كائن ننشئه من الكلاس.
كما أننا قمنا بتعريف دالة اسمها printInfo() عند استدعاءها تقوم بطباعة قيم الخصائص التي يمكلها أي كائن ننشئه من الكلاس
النتيجة لآخر مثال 😊

كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420
🌸يعطيكم العافية🌸
احسنت النشر 🤍
كنت من فترة بنشر عن تطوير pong game باستخدام c++ وكنت بفكر كيف اشرح classes فكفيتي ووفيتي هسا رح ادمجها مع دروسك القيمة🌸 سهلتي عليا المهمة 😁
 
التعديل الأخير:
تم بحمد الله معرفة مفاهيم ال class و struct أما الان سيتم أخذ أمثلة أكثر لمعرفة أفكار جديدة وممارسة الذي تم أخذه في السابق فالنبدأ

المثال الأول => حول كيفية تعريف دالة تأخذ كائن من كلاس كبراميتر , في هذا المثال قمنا بتعريف كلاس إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, اسم المؤلف, سعره و عدد صفحاته.
بعدها قمنا بتعريف دالة إسمها printInfo عند استدعاءها نمرر لها كائن نوعه Book فتقوم بطباعة قيمه بشكل مرتب.
في الأخير قمنا بإنشاء كائن من Book و إعطاؤه قيم, و من ثم تمريره للدالة printInfo() حتى تقوم بطباعة قيمه
كود:
#include <iostream>
using namespace std;
// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {
public:
    string title;
    string author;
    double price;
    int numberOfPages;
};
// فتقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها نمرر لها كائن من printInfo هنا قمنا بتعريف دالة إسمها
void printInfo(Book book)
{
    cout << "Title: " << book.title << "\n";
    cout << "Author: " << book.author << "\n";
    cout << "Price: " << book.price << "$\n";
    cout << "Number of pages: " << book.numberOfPages << "\n";
}
// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;
    // book هنا قمنا بإعطاء قيم لمتغيرات الكائن
    book.title = "C++ for beginners";
    book.author = "Mhamad Harmush";
    book.price = 9.99;
    book.numberOfPages = 420;
  
    // لها حتى تقوم بطباعة القيم الموجودة فيه book و تمرير الكائن printInfo() هنا قمنا باستدعاء الدالة
    printInfo(book);
    return 0;
}
إذًا فالمختلف في هذا المثال أننا قمنا بتمرير براميتر " كائن" Book للدالة , فكان الناتج هو التالي 👇
كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420

المثال الثاني=> حول التفرقة بين براميترات الدوال و خصائص الكلاس
قبل البدء بالمثال يجب علينا معرفة المعلومة التالية أنه يوجد شيء يسمى العامل "this-> "This Pointer حيث يستخدم للتفرقة بين براميترات الدوال و الخصائص الموجودة في الكلاس مما يجعلك قادر على وضع نفس الأسماء للبارميترات و الخصائص و تجنب حدوث أي أخطاء منطقية بسبب الأسماء المتشابهة

في هذا المثال قمنا بتعريف كلاس اسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, اسم المؤلف, سعره و عدد صفحاته.
وتم تعريف دالة تسمى setTitle() عند استدعاءها نمرر لها نص فيتم وضعه كعنوان للكائن الذي قام باستدعائها

كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير t نمرر لها قيمة مكان الباراميتر
    void setTitle(string t)
    {
        title = t;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
  
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
  
    return 0;
}
حيث ستكون نتيجة الكود السابق 👇

كود:
Title: C++ for beginners
أما في حال قمنا بإعادة المثال السابق مع إجراء تعديل بسيط عليه بحيث نجعل إسم الباراميتر الموضوع في الدالة setTitle() هو نفسه اسم المتغير title الموجود في الكلاس
سيظهر لنا مشكلة منطقية عند تشغيل البرنامج
مثال =>
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // title نمرر لها قيمة مكان الباراميتر  Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    void setTitle(string title)
    {
        // الموجود في الكلاس title بداخله من جديد. أي لن يتم تمريرها للمتغير title هنا كأننا قلنا, أعد وضع القيمة التي نمررها للباراميتر
        // لأنهما يملكان نفس الإسم title سبب هذه المشكلة أن المترجم لن يعرف أنك تقصد أنك تريد تمرير القيمة التي تمررها للدالة, إلى المتغير
        title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
  
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
  
    return 0;
}
سنحصل على أن القيمة التي مررناها للدالة setTitle() لم يتم تمريرها للمتغير title الموجود في الكائن book و هذا ما كنا نقصده بخطأ منطقي
كود:
Title:
فلحل المشكلة المنطقية التي شاهدناها في المثال , أي لجعل المترجم قادر على التفرقة بين البارميترات و المتغيرات الموجودة في الكلاس
سنستخدم العامل this-> كلما أردنا الإشارة إلى المتغيرات الموجودة في الكلاس
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير title نمرر لها قيمة مكان الباراميتر
    void setTitle(string title)
    {
        this->title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
  
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
  
    return 0;
}
ستكون النتيجة هي :
كود:
Title: C++ for beginners
وهو المطلوب🤝

المثال الرابع=> في هذا المثال سنكون بحاجة الى معرفة مفهوم الـ Constructor
الكونستركتور ( Constructor ) و الذي هو عبارة عن دالة, يتم إستدعائها أثناء إنشاء كائن من الكلاس لإعطاء قيم أولية للخصائص الموجودة فيه
أيّ كلاس تقوم بتعريفه, يملك كونستركتور افتراضي:) حتى لو تقم بتعريفه بنفسك و سبب ذلك أنه لا يمكن إنشاء كائن من كلاس إلا من خلال كونستركتور هذا الكلاس.
لهذا إن لم تقم بتعريف كونستركتور للكلاس بنفسك, فكن على يقين أن مترجم لغة C++ سيقوم بإنشاء كونستركتور افتراضي فارغ بدلاً عنك عندما تحاول إنشاء كائن من الكلاس
فالقاعدة الأساسية عند تعريف كونستركتور هي أنه يجب أن يحمل نفس اسم الكلاس و يكون نوعه public
وأخيرًا أننا نستطيع تعريف أكثر من كونستركتور
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // هنا قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه
    Book(string title, string author, double price, int numberOfPages)
    {
        // هنا قمنا بوضع القيم التي نمررها للكونستركتور بالترتيب في خصائص الكائن
        this->title = title;
        this->author = author;
        this->price = price;
        this->numberOfPages = numberOfPages;
    }

    // تقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها من أي كائن ننشئه من printInfo هنا قمنا بتعريف دالة إسمها
    void printInfo()
    {
        cout << "Title: " << title << "\n";
        cout << "Author: " << author << "\n";
        cout << "Price: " << price << "$\n";
        cout << "Number of pages: " << numberOfPages << "\n";
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // مع تمرير القيم التي نريد وضعها فيه بشكل مباشر من خلال الكونستركتور book إسمه Book هنا قمنا بتعريف كائن من
    Book book("C++ for beginners", "Mhamad Harmush", 9.99, 420);

    // حتى تقوم بطباعة القيم الموجودة فيه book من الكائن printInfo() هنا قمنا باستدعاء الدالة
    book.printInfo();

    return 0;
}
في هذا المثال , قمنا بتعريف كلاس اسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
في الكلاس Book قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه يمكننا من خلاله إدخال قيم مباشرةً للخصائص الموجودة في أي كائن ننشئه من الكلاس.
كما أننا قمنا بتعريف دالة اسمها printInfo() عند استدعاءها تقوم بطباعة قيم الخصائص التي يمكلها أي كائن ننشئه من الكلاس
النتيجة لآخر مثال 😊

كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420
🌸يعطيكم العافية🌸
شرح رائع وسلسلة البرمجة الكائنية مهمة جدا ,شكرا علي طرحك و جزاكٍ الله خيرا وننتظر جديدك 🔥
 
تم بحمد الله معرفة مفاهيم ال class و struct أما الان سيتم أخذ أمثلة أكثر لمعرفة أفكار جديدة وممارسة الذي تم أخذه في السابق فالنبدأ

المثال الأول => حول كيفية تعريف دالة تأخذ كائن من كلاس كبراميتر , في هذا المثال قمنا بتعريف كلاس إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, اسم المؤلف, سعره و عدد صفحاته.
بعدها قمنا بتعريف دالة إسمها printInfo عند استدعاءها نمرر لها كائن نوعه Book فتقوم بطباعة قيمه بشكل مرتب.
في الأخير قمنا بإنشاء كائن من Book و إعطاؤه قيم, و من ثم تمريره للدالة printInfo() حتى تقوم بطباعة قيمه
كود:
#include <iostream>
using namespace std;
// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {
public:
    string title;
    string author;
    double price;
    int numberOfPages;
};
// فتقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها نمرر لها كائن من printInfo هنا قمنا بتعريف دالة إسمها
void printInfo(Book book)
{
    cout << "Title: " << book.title << "\n";
    cout << "Author: " << book.author << "\n";
    cout << "Price: " << book.price << "$\n";
    cout << "Number of pages: " << book.numberOfPages << "\n";
}
// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;
    // book هنا قمنا بإعطاء قيم لمتغيرات الكائن
    book.title = "C++ for beginners";
    book.author = "Mhamad Harmush";
    book.price = 9.99;
    book.numberOfPages = 420;
  
    // لها حتى تقوم بطباعة القيم الموجودة فيه book و تمرير الكائن printInfo() هنا قمنا باستدعاء الدالة
    printInfo(book);
    return 0;
}
إذًا فالمختلف في هذا المثال أننا قمنا بتمرير براميتر " كائن" Book للدالة , فكان الناتج هو التالي 👇
كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420

المثال الثاني=> حول التفرقة بين براميترات الدوال و خصائص الكلاس
قبل البدء بالمثال يجب علينا معرفة المعلومة التالية أنه يوجد شيء يسمى العامل "this-> "This Pointer حيث يستخدم للتفرقة بين براميترات الدوال و الخصائص الموجودة في الكلاس مما يجعلك قادر على وضع نفس الأسماء للبارميترات و الخصائص و تجنب حدوث أي أخطاء منطقية بسبب الأسماء المتشابهة

في هذا المثال قمنا بتعريف كلاس اسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, اسم المؤلف, سعره و عدد صفحاته.
وتم تعريف دالة تسمى setTitle() عند استدعاءها نمرر لها نص فيتم وضعه كعنوان للكائن الذي قام باستدعائها

كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير t نمرر لها قيمة مكان الباراميتر
    void setTitle(string t)
    {
        title = t;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
  
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
  
    return 0;
}
حيث ستكون نتيجة الكود السابق 👇

كود:
Title: C++ for beginners
أما في حال قمنا بإعادة المثال السابق مع إجراء تعديل بسيط عليه بحيث نجعل إسم الباراميتر الموضوع في الدالة setTitle() هو نفسه اسم المتغير title الموجود في الكلاس
سيظهر لنا مشكلة منطقية عند تشغيل البرنامج
مثال =>
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // title نمرر لها قيمة مكان الباراميتر  Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    void setTitle(string title)
    {
        // الموجود في الكلاس title بداخله من جديد. أي لن يتم تمريرها للمتغير title هنا كأننا قلنا, أعد وضع القيمة التي نمررها للباراميتر
        // لأنهما يملكان نفس الإسم title سبب هذه المشكلة أن المترجم لن يعرف أنك تقصد أنك تريد تمرير القيمة التي تمررها للدالة, إلى المتغير
        title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
  
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
  
    return 0;
}
سنحصل على أن القيمة التي مررناها للدالة setTitle() لم يتم تمريرها للمتغير title الموجود في الكائن book و هذا ما كنا نقصده بخطأ منطقي
كود:
Title:
فلحل المشكلة المنطقية التي شاهدناها في المثال , أي لجعل المترجم قادر على التفرقة بين البارميترات و المتغيرات الموجودة في الكلاس
سنستخدم العامل this-> كلما أردنا الإشارة إلى المتغيرات الموجودة في الكلاس
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير title نمرر لها قيمة مكان الباراميتر
    void setTitle(string title)
    {
        this->title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
  
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
  
    return 0;
}
ستكون النتيجة هي :
كود:
Title: C++ for beginners
وهو المطلوب🤝

المثال الرابع=> في هذا المثال سنكون بحاجة الى معرفة مفهوم الـ Constructor
الكونستركتور ( Constructor ) و الذي هو عبارة عن دالة, يتم إستدعائها أثناء إنشاء كائن من الكلاس لإعطاء قيم أولية للخصائص الموجودة فيه
أيّ كلاس تقوم بتعريفه, يملك كونستركتور افتراضي:) حتى لو تقم بتعريفه بنفسك و سبب ذلك أنه لا يمكن إنشاء كائن من كلاس إلا من خلال كونستركتور هذا الكلاس.
لهذا إن لم تقم بتعريف كونستركتور للكلاس بنفسك, فكن على يقين أن مترجم لغة C++ سيقوم بإنشاء كونستركتور افتراضي فارغ بدلاً عنك عندما تحاول إنشاء كائن من الكلاس
فالقاعدة الأساسية عند تعريف كونستركتور هي أنه يجب أن يحمل نفس اسم الكلاس و يكون نوعه public
وأخيرًا أننا نستطيع تعريف أكثر من كونستركتور
كود:
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
  
    // هنا قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه
    Book(string title, string author, double price, int numberOfPages)
    {
        // هنا قمنا بوضع القيم التي نمررها للكونستركتور بالترتيب في خصائص الكائن
        this->title = title;
        this->author = author;
        this->price = price;
        this->numberOfPages = numberOfPages;
    }

    // تقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها من أي كائن ننشئه من printInfo هنا قمنا بتعريف دالة إسمها
    void printInfo()
    {
        cout << "Title: " << title << "\n";
        cout << "Author: " << author << "\n";
        cout << "Price: " << price << "$\n";
        cout << "Number of pages: " << numberOfPages << "\n";
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // مع تمرير القيم التي نريد وضعها فيه بشكل مباشر من خلال الكونستركتور book إسمه Book هنا قمنا بتعريف كائن من
    Book book("C++ for beginners", "Mhamad Harmush", 9.99, 420);

    // حتى تقوم بطباعة القيم الموجودة فيه book من الكائن printInfo() هنا قمنا باستدعاء الدالة
    book.printInfo();

    return 0;
}
في هذا المثال , قمنا بتعريف كلاس اسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
في الكلاس Book قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه يمكننا من خلاله إدخال قيم مباشرةً للخصائص الموجودة في أي كائن ننشئه من الكلاس.
كما أننا قمنا بتعريف دالة اسمها printInfo() عند استدعاءها تقوم بطباعة قيم الخصائص التي يمكلها أي كائن ننشئه من الكلاس
النتيجة لآخر مثال 😊

كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420
🌸يعطيكم العافية🌸
أحسنتي الشرح يا سديل، أجمل مافي الموضوع الاستمرارية ومستوى الشرح في تطور دائم، مش زي بعض الناس الله يستر علينا وعليهم
استمري ❤️ 🔥
 

آخر المشاركات

فانوس

رمضان
عودة
أعلى