Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

C++المتغيرات و الدوال المشتركة

  • مفهوم الأشياء المشتركة
  • المتغيرات المشتركة
  • الدوال المشتركة

مفهوم الأشياء المشتركة

الأشياء المشتركة ( Static Members ) عبارة عن أي شيء يتم تعريفه في الكلاس بشكل يكون موّحداً بالنسبة لجميع الكائنات التي يتم إنشاءها منه.
بشكل عام لجعل الشيئ الذي يتم تعريفه في الكلاس مشترك بين جميع الكائنات التي قد ننشئها منه نستخدم الكلمة static كما سنرى بعد قليل في الأمثلة.


فوائد الأشياء المشتركة

الأشياء المشتركة لها عدة استخدامات و فوائد فعلى سبيل المثال إذا أردت جميع الكائنات التي يتم إنشاءها من كلاس محدد تملك نفس قيمة متغير موجود في هذا الكلاس, يمكنك جعل نوع المتغير static و عندها سيصبج مشترك بين جميع الكائنات.

من ناحية الذاكرة, بما أن المتغير المشترك يكون نفسه موضوع لجميع الكائنات التي يتم إنشاؤها من نفس الكلاس, فهذا يعني أنك لو قمت بإنشاء 50 كائن من الكلاس فإنه لن يتم إنشاء 50 نسخة من المتغير في الذاكرة, بل سيكون هناك نسخة واحدة منه مشتركة بين جميع الكائنات.

في هذا الدرس سنتعرف على كيفية تعريف متغيرات و دوال مشتركة و كيفية التعامل معها.

المتغيرات المشتركة

تعريف المتغير في الكلاس كمتغير مشترك يجعلك قادر على الوصول لقيمة هذا المتغير بشكل مباشر من الكلاس, أي بدون الحاجة لإنشاء كائن منه.
عند تعريف المتغير المشترك, لا يسمح لك بإعطائه قيمة أولية بداخل الكلاس حيث أنك يجب أن تعطيه قيمة أولية خارج الكلاس.

بعد إسناد قيمة أولية للمتغير المشترك, تستطيع تغيير قيمته لاحقاً من خلال أي كائن يمكنه الوصول إليها.


المتغير المشترك يجب تعريفه على مرحتلين:

  • يجب تعريفه بداخل الكلاس بدون إعطائه قيمة أولية مع الإشارة إلى أنه يجب تحديد نوعه static.
  • يجب إعطاؤه قيمة أولية خارج الكلاس.


في المثال التالي, قمنا بتعريف كلاس إسمه Demo يحتوي على متغير عادي إسمه x و متغير مشترك إسمه y.
المتغير المشترك y قمنا بإعطائه 0 كقيمة أولية خارج الكلاس كما يفترض.
بعدها قمنا بإنشاء ثلاث كائنات من الكلاس Demo و إعطاء قيمة مختلفة للمتغير x الخاص بكل الكائن.
في النهاية قمنا بتغيير قيمة المتغير المشترك y مرة واحدة حتى نلاحظ كيف أنها تغيرت بالنسبة لجميع الكائنات.

مثال

main.cpp
#include <iostream>
using namespace std;
// Demo هنا قمنا بتعريف الكلاس
class Demo {
// y و المتغير المشترك x هنا قمنا بتعريف المتغير
public:
int x;
static int y;
};
// القيمة 0 كقيمة أولية y هنا قمنا بإعطاء المتغير المشترك
int Demo::y = 0;
// main() هنا قمنا بتعريف الدالة
int main()
{
// Demo هنا قمنا بتعريف ثلاث كائنات من الكلاس
Demo demo1, demo2, demo3;
// التي يملكها كل كائن قمنا بإنشائه x هنا قمنا بتغيير قيمة المتغير
demo1.x = 10;
demo2.x = 20;
demo3.x = 30;
// التي يملكها كل كائن قمنا بإنشائه x هنا قمنا بطباعة قيمة المتغير
cout << "demo1.x = " << demo1.x << endl;
cout << "demo2.x = " << demo2.x << endl;
cout << "demo3.x = " << demo3.x << endl;
// التي هي نفسها لكل الكائنات و بالطبع الآن قيمته هي 0 لأننا لم نقم بتغيير قيمته الأولية y هنا قمنا بطباعة قيمة المتغير المشترك
cout << "Demo.y = " << demo1.y << endl;
cout << "Demo.y = " << demo2.y << endl;
cout << "Demo.y = " << demo3.y << endl;
// demo1 إلى 5 من خلال الكائن y هنا قمنا بتغيير قيمة
// سيتم إعتبار أنها تغييرت بالنسبة لجميع الكائنات لأنها مشتركة فيما بينهم demo3 أو demo2 أو demo1 ملاحظة: سواء غيرناها من خلال الكائن
demo1.y = 5;
// demo1 من جديد للتأكد ما إن كانت حقاً أصبحت تساوي 5 أم لا بالنسبة لجميع الكائنات و ليس فقط الكائن y هنا قمنا بطباعة قيمة المتغير المشترك
cout << "Demo.y = " << demo1.y << endl;
cout << "Demo.y = " << demo2.y << endl;
cout << "Demo.y = " << demo3.y << endl;
return 0;
}
#include <iostream> using namespace std; // Demo هنا قمنا بتعريف الكلاس class Demo { // y و المتغير المشترك x هنا قمنا بتعريف المتغير public: int x; static int y; }; // القيمة 0 كقيمة أولية y هنا قمنا بإعطاء المتغير المشترك int Demo::y = 0; // main() هنا قمنا بتعريف الدالة int main() { // Demo هنا قمنا بتعريف ثلاث كائنات من الكلاس Demo demo1, demo2, demo3; // التي يملكها كل كائن قمنا بإنشائه x هنا قمنا بتغيير قيمة المتغير demo1.x = 10; demo2.x = 20; demo3.x = 30; // التي يملكها كل كائن قمنا بإنشائه x هنا قمنا بطباعة قيمة المتغير cout << "demo1.x = " << demo1.x << endl; cout << "demo2.x = " << demo2.x << endl; cout << "demo3.x = " << demo3.x << endl; // التي هي نفسها لكل الكائنات و بالطبع الآن قيمته هي 0 لأننا لم نقم بتغيير قيمته الأولية y هنا قمنا بطباعة قيمة المتغير المشترك cout << "Demo.y = " << demo1.y << endl; cout << "Demo.y = " << demo2.y << endl; cout << "Demo.y = " << demo3.y << endl; // demo1 إلى 5 من خلال الكائن y هنا قمنا بتغيير قيمة // سيتم إعتبار أنها تغييرت بالنسبة لجميع الكائنات لأنها مشتركة فيما بينهم demo3 أو demo2 أو demo1 ملاحظة: سواء غيرناها من خلال الكائن demo1.y = 5; // demo1 من جديد للتأكد ما إن كانت حقاً أصبحت تساوي 5 أم لا بالنسبة لجميع الكائنات و ليس فقط الكائن y هنا قمنا بطباعة قيمة المتغير المشترك cout << "Demo.y = " << demo1.y << endl; cout << "Demo.y = " << demo2.y << endl; cout << "Demo.y = " << demo3.y << endl; return 0; }

سنحصل على النتيجة التالية عند التشغيل.

demo1.x = 10
demo2.x = 20
demo3.x = 30
Demo.y = 0
Demo.y = 0
Demo.y = 0
Demo.y = 5
Demo.y = 5
Demo.y = 5
demo1.x = 10 demo2.x = 20 demo3.x = 30 Demo.y = 0 Demo.y = 0 Demo.y = 0 Demo.y = 5 Demo.y = 5 Demo.y = 5

الدوال المشتركة

فكرة الدوال المشتركة ببساطة هي تعريف دالة في كلاس يمكن استدعاءها بشكل مباشر منه بدون الحاجة لإنشاء كائن منه.
الدالة التي يتم تعريفها كدالة مشتركة يمكنها فقط التعامل مع المتغيرات المشتركة, أي التي نوعها static مثلها.

بالنسبة لطريقة تعريف دالة مشتركة فهي نفسها طريقة تعريف دالة عادية مع إضافة الكلمة static إليها.



في المثال التالي, سنستخدم متغير و دالة مشتَركين لمعرفة عدد الكائنات التي يتم إنشاؤها من الكلاس.

في البداية قمنا بتعريف كلاس إسمه Demo يحتوي على متغير مشترك إسمه counter و دالة مشتركة إسمها getCounter عند استدعاءها تقوم بإرجاع قيمة المتغير counter فقط.

في الكلاس Demo قمنا بتعديل الكونستركتور الإفتراضي لجعله يقوم بإضافة 1 على قيمة المتغير counter كلما تم إستدعاؤه.
بمعنى آخر, كلما قمنا بإنشاء كائن - من خلال الكونستركتور الإفتراضي - سيتم إضافة 1 على قيمة المتغير counter و بالتالي فإن قيمة coutner ستمثل عدد الكائنات التي يتم إنشاءها من الكلاس Demo.

في النهاية قمنا بإنشاء ثلاث كائنات من الكلاس Demo و من ثم إستدعاء الدالة getCounter() لمعرفة عدد الكائنات التي تم إنشاؤها.

مثال

main.cpp
#include <iostream>
using namespace std;
// Demo هنا قمنا بتعريف الكلاس
class Demo {
public:
// counter هنا قمنا بتعريف المتغير المشترك
static int counter;
// كلما تم استدعاؤه counter هنا قمنا بتعريف الكونستركتور و جعلناه يزيد 1 على قيمة المتغير المشترك
Demo()
{
counter++;
}
// فقط عندما يتم استدعاءها counter و قلنا أنها ترجع قيمة المشترك getCounter() هنا قمنا بتعريف الدالة المشتركة
static int getCounter()
{
return counter;
}
};
// القيمة 0 كقيمة أولية counter هنا قمنا بإعطاء المتغير المشترك
int Demo::counter = 0;
// main() هنا قمنا بتعريف الدالة
int main()
{
// Demo هنا قمنا بتعريف ثلاث كائنات من الكلاس
Demo demo1, demo2, demo3;
// لطباعة عدد الكائنات التي تم إنشاءها منه Demo من الكلاس getCounter() هنا قمنا باستدعاء الدالة
cout << "total created object = " << Demo::getCounter();
return 0;
}
#include <iostream> using namespace std; // Demo هنا قمنا بتعريف الكلاس class Demo { public: // counter هنا قمنا بتعريف المتغير المشترك static int counter; // كلما تم استدعاؤه counter هنا قمنا بتعريف الكونستركتور و جعلناه يزيد 1 على قيمة المتغير المشترك Demo() { counter++; } // فقط عندما يتم استدعاءها counter و قلنا أنها ترجع قيمة المشترك getCounter() هنا قمنا بتعريف الدالة المشتركة static int getCounter() { return counter; } }; // القيمة 0 كقيمة أولية counter هنا قمنا بإعطاء المتغير المشترك int Demo::counter = 0; // main() هنا قمنا بتعريف الدالة int main() { // Demo هنا قمنا بتعريف ثلاث كائنات من الكلاس Demo demo1, demo2, demo3; // لطباعة عدد الكائنات التي تم إنشاءها منه Demo من الكلاس getCounter() هنا قمنا باستدعاء الدالة cout << "total created object = " << Demo::getCounter(); return 0; }

سنحصل على النتيجة التالية عند التشغيل.

total created object = 3
total created object = 3