




السمعة:
- إنضم2 سبتمبر 2023
- المشاركات 140
- مستوى التفاعل 244
- النقاط 43
تم بحمد الله معرفة مفاهيم ال class و struct أما الان سيتم أخذ أمثلة أكثر لمعرفة أفكار جديدة وممارسة الذي تم أخذه في السابق فالنبدأ
المثال الأول => حول كيفية تعريف دالة تأخذ كائن من كلاس كبراميتر , في هذا المثال قمنا بتعريف كلاس إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, اسم المؤلف, سعره و عدد صفحاته.
بعدها قمنا بتعريف دالة إسمها printInfo عند استدعاءها نمرر لها كائن نوعه Book فتقوم بطباعة قيمه بشكل مرتب.
في الأخير قمنا بإنشاء كائن من Book و إعطاؤه قيم, و من ثم تمريره للدالة printInfo() حتى تقوم بطباعة قيمه
إذًا فالمختلف في هذا المثال أننا قمنا بتمرير براميتر " كائن" Book للدالة , فكان الناتج هو التالي 
المثال الثاني=> حول التفرقة بين براميترات الدوال و خصائص الكلاس
قبل البدء بالمثال يجب علينا معرفة المعلومة التالية أنه يوجد شيء يسمى العامل "this-> "This Pointer حيث يستخدم للتفرقة بين براميترات الدوال و الخصائص الموجودة في الكلاس مما يجعلك قادر على وضع نفس الأسماء للبارميترات و الخصائص و تجنب حدوث أي أخطاء منطقية بسبب الأسماء المتشابهة
في هذا المثال قمنا بتعريف كلاس اسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, اسم المؤلف, سعره و عدد صفحاته.
وتم تعريف دالة تسمى setTitle() عند استدعاءها نمرر لها نص فيتم وضعه كعنوان للكائن الذي قام باستدعائها
حيث ستكون نتيجة الكود السابق 
أما في حال قمنا بإعادة المثال السابق مع إجراء تعديل بسيط عليه بحيث نجعل إسم الباراميتر الموضوع في الدالة setTitle() هو نفسه اسم المتغير title الموجود في الكلاس
سيظهر لنا مشكلة منطقية عند تشغيل البرنامج
مثال =>
سنحصل على أن القيمة التي مررناها للدالة setTitle() لم يتم تمريرها للمتغير title الموجود في الكائن book و هذا ما كنا نقصده بخطأ منطقي
فلحل المشكلة المنطقية التي شاهدناها في المثال , أي لجعل المترجم قادر على التفرقة بين البارميترات و المتغيرات الموجودة في الكلاس
سنستخدم العامل this-> كلما أردنا الإشارة إلى المتغيرات الموجودة في الكلاس
ستكون النتيجة هي :
وهو المطلوب
المثال الرابع=> في هذا المثال سنكون بحاجة الى معرفة مفهوم الـ Constructor
الكونستركتور ( Constructor ) و الذي هو عبارة عن دالة, يتم إستدعائها أثناء إنشاء كائن من الكلاس لإعطاء قيم أولية للخصائص الموجودة فيه
أيّ كلاس تقوم بتعريفه, يملك كونستركتور افتراضي
حتى لو تقم بتعريفه بنفسك و سبب ذلك أنه لا يمكن إنشاء كائن من كلاس إلا من خلال كونستركتور هذا الكلاس.
لهذا إن لم تقم بتعريف كونستركتور للكلاس بنفسك, فكن على يقين أن مترجم لغة C++ سيقوم بإنشاء كونستركتور افتراضي فارغ بدلاً عنك عندما تحاول إنشاء كائن من الكلاس
فالقاعدة الأساسية عند تعريف كونستركتور هي أنه يجب أن يحمل نفس اسم الكلاس و يكون نوعه public
وأخيرًا أننا نستطيع تعريف أكثر من كونستركتور
في هذا المثال , قمنا بتعريف كلاس اسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
في الكلاس Book قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه يمكننا من خلاله إدخال قيم مباشرةً للخصائص الموجودة في أي كائن ننشئه من الكلاس.
كما أننا قمنا بتعريف دالة اسمها printInfo() عند استدعاءها تقوم بطباعة قيم الخصائص التي يمكلها أي كائن ننشئه من الكلاس
النتيجة لآخر مثال
يعطيكم العافية
المثال الأول => حول كيفية تعريف دالة تأخذ كائن من كلاس كبراميتر , في هذا المثال قمنا بتعريف كلاس إسمه 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;
}

كود:
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
سيظهر لنا مشكلة منطقية عند تشغيل البرنامج
مثال =>
كود:
#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;
}
كود:
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 قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه يمكننا من خلاله إدخال قيم مباشرةً للخصائص الموجودة في أي كائن ننشئه من الكلاس.
كما أننا قمنا بتعريف دالة اسمها printInfo() عند استدعاءها تقوم بطباعة قيم الخصائص التي يمكلها أي كائن ننشئه من الكلاس
النتيجة لآخر مثال

كود:
Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420


دروس البرمجة الكائنية
التعديل الأخير بواسطة المشرف: