وظيفة العضو الثابت في C++ (أمثلة)

ما هي الوظيفة الثابتة في C++؟

في فئات C++، العضو الثابت هو عضو فئة ينتمي إلى الفئة وليس إلى كائناتها. سيكون لديك نسخة واحدة فقط من العضوية. هذه هي الحالة بغض النظر عن عدد الكائنات التي تقوم بإنشائها.

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

لماذا استخدام الوظائف الثابتة؟

على عكس وظائف C++ العامة، لا يمكن الوصول إلى الوظائف الثابتة إلا من ملف التصريح. إذا كانت هناك حاجة لتقييد الوصول إلى وظيفة ما، فاجعلها ثابتة.

استخدم دالة ثابتة لتقييد إعادة استخدام نفس اسم الوظيفة في ملف آخر.

تعريف الوظائف الثابتة في C++

بناء الجملة:

static int myfunc(void)
{
    cout("Example of C++ static function ");
}

في المثال أعلاه، نقوم بتعريف دالة ثابتة تسمى myfunc. لاحظ استخدام الكلمة الأساسية الثابتة في التعريف. تأتي الكلمة الأساسية قبل اسم الوظيفة.

وظيفة العضو الثابت في C++

عندما يتم تعريف عضو دالة بأنه ثابت، فإنه يصبح مستقلاً عن الكائنات الأخرى في الفئة. يمكنك استدعاء وظيفة عضو ثابت حتى في حالة عدم وجود كائنات فئة أخرى.

للوصول إلى أسماء الفئات، يجب عليك استخدام اسم الفئة ودقة النطاق operaتور (::). يمكن للوظيفة الثابتة الوصول فقط إلى الوظائف الثابتة الأخرى وأعضاء البيانات الثابتة والوظائف الأخرى خارج الفئة. يقع نطاق وظائف الأعضاء الثابتة داخل الفئة، ولا يمكنهم الوصول إلى مؤشر الفئة هذا.

مثال 1

#include<iostream>
using namespace std;
class BoxClass {
public:
	static int count;
	BoxClass(double l = 2.0, double b = 2.0, double h = 2.0) {
		cout << "Class constructor called." << endl;
		length = l;
		breadth = b;
		height = h;
		count++;
	}
	double getVolume() {
		return length * breadth * height;
	}
	static int getCount() {
		return count;
	}
private:
	double length;     
	double breadth;    
	double height;     
};
int BoxClass::count = 0;
int main(void) {
	cout << "Inital value of count is : " << BoxClass::getCount() << endl;
	BoxClass Box1(3.2, 1.4, 1.8);    
	BoxClass Box2(7.5, 4.0, 4.0);   
	cout << "Final value of count is : " << BoxClass::getCount() << endl;
	return 0;
}

الإخراج:

وظيفة العضو الثابت

فيما يلي لقطة شاشة للكود:

وظيفة العضو الثابت

شرح الكود:

  1. بما في ذلك ملف رأس iostream في برنامج C++ الخاص بنا لاستخدامه وظائف.
  2. قم بتضمين مساحة الاسم std في الكود لاستخدام فئاتها دون استدعائها.
  3. قم بإنشاء فئة باسم Boxالطبقة.
  4. استخدم معدّل الوصول العام لتحديد عضو الفصل الذي يمكن الوصول إليه بشكل عام.
  5. قم بتعريف عضو فئة ثابت يسمى العد.
  6. استخدم مُنشئ الفصل لتهيئة ثلاثة متغيرات لـ a double اكتب.
  7. طباعة بعض النص على وحدة التحكم. تعمل وظيفة endl (خط النهاية) على تحريك مؤشر الماوس إلى السطر التالي.
  8. تهيئة قيمة l إلى طول متغير.
  9. تهيئة قيمة b إلى اتساع متغير.
  10. تهيئة قيمة h إلى الارتفاع المتغير.
  11. ثم قم بزيادة قيمة عدد المتغير بمقدار 1 في كل مرة يتم فيها إنشاء كائن جديد.
  12. نهاية الجسم المنشئ.
  13. قم بإنشاء دالة باسم doubleمقدار().
  14. تحديد ما doubleستعود وظيفة Volume(). يجب أن يُرجع ضرب متغيرات الطول والعرض والارتفاع.
  15. نهاية ال doubleجسم الدالة Volume().
  16. قم بتعريف دالة ثابتة تسمى getCount().
  17. يجب أن تقوم الدالة getCount() بإرجاع قيمة متغير العدد.
  18. نهاية نص الدالة getCount().
  19. استخدم معدّل الوصول الخاص لوضع علامة على عضو الفصل على أنه يمكن الوصول إليه بشكل عام.
  20. الإعلان عن عضو الفصل المسمى بطول أ double نوع البيانات. سيكون الوصول إليه خاصًا.
  21. قم بتعريف عضو آخر في الفصل يدعى عرض أ double نوع البيانات. سيكون الوصول إليه خاصًا.
  22. الإعلان عن عضو الفصل المسمى ارتفاع double نوع البيانات. سيكون الوصول إليه خاصًا.
  23. نهاية الجسم Boxفئة الطبقة.
  24. ثم قم بتهيئة عضو ثابت في Boxفئة الطبقة.
  25. استدعاء الدالة الرئيسية (). يجب إضافة منطق برنامج C++ داخل نص هذه الوظيفة.
  26. اطبع بعض النص على وحدة التحكم يوضح العدد الحالي للكائنات قبل إنشاء كائنات جديدة.
  27. قم بتعريف كائن اسمه Box1، وهو أحد مثيلات الفصل Boxفصل. يجب تحديد قيم العرض والطول والارتفاع بين قوسين.
  28. قم بتعريف كائن اسمه Box2، وهو مثال للفئة Boxفصل. تم تحديد قيم العرض والطول والارتفاع بين قوسين.
  29. اطبع بعض النص على وحدة التحكم يوضح العدد الحالي للكائنات بعد إنشاء كائنات جديدة.
  30. برنامج C ++ يجب إرجاع القيمة عند الانتهاء بنجاح.
  31. نهاية نص الوظيفة الرئيسية ().

الوصول إلى الوظائف الثابتة

لا تحتاج إلى إنشاء كائن فئة للوصول إلى وظيفة ثابتة. بدلاً من ذلك، يمكنك استخدام اسم الفئة ودقة النطاق operaتور (::).

بناء الجملة:

className::funcName

أعلاه، className هو اسم الفئة التي تم تعريف الوظيفة الثابتة فيها. funcName هو الاسم المخصص للوظيفة الثابتة.

مثال 2

#include<iostream> 
using namespace std;
class MyClass {
public:
	static void msgFunc() {
		cout << "Welcome to Guru99!";
	}
};
int main() {
	MyClass::msgFunc();
}

الإخراج:

الوصول إلى الوظائف الثابتة

فيما يلي لقطة شاشة للكود:

الوصول إلى الوظائف الثابتة

شرح الكود:

  1. تضمين ملف رأس iostream في برنامجنا لاستخدام وظائفه.
  2. قم بتضمين مساحة الاسم std في التعليمات البرمجية الخاصة بك لاستخدام فئاتها دون الاتصال بها.
  3. قم بإنشاء فئة باسم MyClass.
  4. استخدم معدّل الوصول العام لوضع علامة على عضو الفصل على أنه يمكن الوصول إليه بشكل عام.
  5. الإعلان عن دالة ثابتة تسمى msgFunc(). الكلمة الأساسية الثابتة تجعل الوظيفة ثابتة.
  6. حدد النص الذي تريد طباعته على وحدة التحكم بمجرد استدعاء/استدعاء الوظيفة أعلاه.
  7. نهاية نص الدالة msgFunc().
  8. إنهاء جسم الفصل.
  9. استدعاء الدالة الرئيسية ().
  10. استدعاء الدالة الثابتة المسماة msgFunc().
  11. نهاية نص الوظيفة الرئيسية ().

الوصول إلى المتغيرات الثابتة

تنتمي المتغيرات الثابتة إلى فئة بدلاً من كائنات فئة. إذا كان المتغير الثابت عامًا، فيمكن الوصول إليه باستخدام اسم الفئة واستخدام دقة النطاق operaتور. ومع ذلك، هذا غير ممكن إذا كان العضو الثابت خاصًا.

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

مثال 3: متغير ثابت في فئة C++

#include<iostream> 
using namespace std;
class AClass {
private:
	static int myvar;
public:
	static int getVar() { 
		return myvar; 
		} 
};
int AClass::myvar = 23; 
int main() {
	cout <<"The value of myvar is: "<< AClass::getVar() << '\n';
}

الإخراج:

الوصول إلى المتغيرات الثابتة

فيما يلي لقطة شاشة للكود:

الوصول إلى المتغيرات الثابتة

شرح الكود:

  1. بما في ذلك ملف رأس iostream في برنامجنا.
  2. قم بتضمين مساحة الاسم std في هذا البرنامج لاستخدام فئاته دون الاتصال.
  3. قم بإنشاء فئة تسمى AClass.
  4. استخدم معدل الوصول الخاص لجعل المتغير myvar قابلاً للوصول بشكل خاص.
  5. قم بإنشاء متغير عدد صحيح ثابت يسمى myvar.
  6. استخدم مُعدِّل الوصول العام الذي يحدد الدالة getVar() على أنها يمكن الوصول إليها بشكل عام.
  7. إنشاء دالة ثابتة باسم getVar().
  8. يجب أن تكون الدالة getVar() قادرة على إرجاع قيمة المتغير myvar.
  9. نهاية نص الدالة getVar().
  10. نهاية جسم الفئة A.
  11. قم بتعيين المتغير myvar بقيمة 23. لقد استخدمنا اسم الفئة ودقة النطاق operaتور لهذا.
  12. استدعاء الدالة الرئيسية ().
  13. اطبع قيمة المتغير myVar على وحدة التحكم بجانب النص الآخر. لقد استخدمنا اسم الفئة والوظيفة الثابتة ودقة النطاق operator للوصول إلى قيمة هذا المتغير.
  14. نهاية نص الدالة main().

هذا المؤشر في وظائف ثابتة

لا يتم إرفاق وظيفة ثابتة بكائن. ولهذا السبب لا تحتوي الوظائف الثابتة على هذا المؤشر. يشير مؤشر الكائن عادةً إلى الكائن الذي يعمل عليه حاليًا. وبما أن الوظائف الثابتة لا تعمل مع الكائنات، فليست هناك حاجة لهذا المؤشر.

تتمتع الوظائف الثابتة بإمكانية الوصول المباشر إلى الأعضاء الثابتين الآخرين. ومع ذلك، هذا ليس هو الحال مع الأعضاء غير الثابتين. والسبب هو أن الأعضاء غير الثابتين يجب أن ينتموا إلى كائن، لكن الوظائف الثابتة لا تحتوي على كائنات للعمل معها.

مثال 4

من الممكن تعريف دالة ثابتة خارج إعلان الفئة. دعونا نثبت هذا:

#include<iostream> 
using namespace std;
class NumGenerator {
private:
	static int nextNum; 
public:
	static int getNextNum();
};
int NumGenerator::nextNum = 1;
int NumGenerator::getNextNum() {
	return nextNum++; 
}
int main() {
	for (int count = 0; count < 5; ++count)
		std::cout << "The next number is: " << NumGenerator::getNextNum() << '\n';
	return 0;
}

الإخراج:

هذا المؤشر في وظائف ثابتة

فيما يلي لقطة شاشة للكود الخاص بك:

هذا المؤشر في وظائف ثابتة

شرح الكود:

  1. تضمين ملف رأس iostream في الكود الخاص بنا لاستخدام وظائفه.
  2. قم بتضمين مساحة الاسم std في الكود الخاص بنا لاستخدام فئاتها دون استدعائها.
  3. قم بإنشاء فئة باسم NumGenerator.
  4. باستخدام معدل الوصول الخاص لتحديد المتغير، نحن على وشك إنشاء متغير يمكن الوصول إليه بشكل خاص.
  5. قم بإنشاء متغير عدد صحيح ثابت يسمى nextNum.
  6. استخدام مُعدِّل الوصول العام الذي يساعدك على تحديد المتغير الذي نحن على وشك إنشائه باعتباره متاحًا للعامة.
  7. الإعلان عن دالة ثابتة تسمى getNextNum().
  8. نهاية الجسم الصفي.
  9. قم بتعيين المتغير nextNum بقيمة 1. لقد قمنا بذلك باستخدام اسم الفئة واسم المتغير ودقة النطاق operaتور.
  10. تحديد الدالة الثابتة getNextNum() خارج الفئة.
  11. حدد الإجراء الذي سيتم اتخاذه عند استدعاء/استدعاء الوظيفة أعلاه. سيؤدي ذلك إلى زيادة قيمة المتغير nextNum بمقدار 1.
  12. نهاية تعريف الدالة getNextNum().
  13. استدعاء الدالة الرئيسية (). يجب إضافة منطق برنامج C++ داخل نص هذه الوظيفة.
  14. إستخدم لحلقة لإنشاء متغير اسمه count. يجب أن تزيد قيمة هذا المتغير من 0 إلى 4. وبعد كل تكرار، ستزداد قيمة المتغير بمقدار 1.
  15. طباعة قيمة المتغير nextNum إلى جانب نص آخر على وحدة التحكم عند كل تكرار. يتم الوصول إلى القيمة باستخدام الدالة getNextNum().
  16. يجب أن يقوم برنامج C++ هذا بإرجاع قيمة عند اكتماله بنجاح.
  17. نهاية الوظيفة الرئيسية ().

نبذة عامة

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