الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما الذي نستفيده من Base Member Initialization

بدأه Islamic_Empire في 17 يوليو 2008 · 1 رد · 734 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

أنا لا أزال مبرمج مبتدئ يتعلم اساسيات ال سي بلس بلس و خصائص ال class فيها وقرأت عن موضوع ال Base Member Initialization ولم أفهم ما الفائدة التي سنجنيها من هذه الطريقة

شئ آخر شبيه وهو ما يعرف بال Copy Constructors وكيف تعرف نسختك الخاصة بك منه بدل من ال Constructor الافتراضي الذي يعرفه السي بلس بلس

عذرا فانا ابحث عن تطبيقات استطيع ان استوعب بها هذه المفاهيم بشكل احسن واتدرب عليها

اتمنى الاجابة من الخبراء

سلام

#2

بالنسبه الى دوال البناء Constructor فيمكن كتابتها بطريقتين ، الأولى أما بالشكل العادي الذي نعرفه في الدوال ، والشكل الثاني عن طريق الـ Initializing List .

ex : initializing member function in constructor defintion

complx(double r, double i = 0.0) { re = r; im = i; }

في الـ Initializing List :

complx(double r, double i = 0) : re(r), im(i) { /* ... */ }

وفي الطريقتين ، سواء الأولى أو الثانيه ، سوف يتم تهئيه متغيراتك بالشكل المطلوب ، لكن طريقه العمل في الـ Initializing List تختلف قليلا ، حيث أول ما يشاهد المترجم هذه الجمله ، سوف يبدأ -قبل الدخول في تعريف الداله- باعطاء المتغيرات القيم المناسبه التي وضعتها له بين القوسين . وترتيب عمليه التهيئه في هذه الحاله سوف يكون على حسب تعريفك للمتغيرات الموجوده في الكلاس وليس على حسب وضعك للقيم في الـ Initializing List .

في بعض الحالات يجب عليك أن تستخدم الـ Initializing List ، وسوف يكون هناك خطأ بالترجمه ان أستخدمت الطريقه العاديه ، من هذه الحالات :

اعطاء قيم للثوابت const (بشرط تكون non-static ) .

اعطاء قيم للمراجع Reference .

في حالات الوراثه عندما نقوم باستدعاء داله بناء معينه في الكلاس الأب .

مثال صغير على أول حالتين :

class A {
public:
  A(int) { }
};

class B : public A {
  static const int i;
  const int j;
  int &k;
public:
  B(int& arg) : A(0), j(1), k(arg) { }
};

int main() {
  int x = 0;
  B obj(x);
};

ويمكن أيضا أن نستدعى دوال Member Function أيضا ، لكن يجب أخذ الحذر ، فاذا كان لدينا كلاس أب يجب أن نهئيه بشكل كامل حتى لا نقع في مشكله بيانات غير معروفه undefined behavior ، مثال :

#include <iostream>
using namespace std;

struct A {
  int i;
  A(int arg) : i(arg) {
	cout << "Value of i: " << i << endl;
  }
};

struct B : A {
  int j;
  int f() { return i; }
  B();
};

B::B() : A(f()), j(1234) {
   cout << "Value of j: " << j << endl;
}

int main() {
  B obj;
}

في المثال السابق قمنا باستدعاء داله f عندما أردنا أن نستدعي داله البناء في A ، وهنا الناتج i سوف يكون قيمه غير معروفه لأننا لم نعطيها قيمه الى الأن ...

يمكن أن نصلح البرنامج السابق باعطاء داله البناء قيمه معروفه وهكذا سيعمل بلا مشاكل :

#include <iostream>
using namespace std;

struct A {
  int i;
  A(int arg) : i(arg) {
	cout << "Value of i: " << i << endl;
  }
};

struct B : A {
  int j;
  int f() { return i; }
  B();
};

B::B() : A(5678), j(f()) {
   cout << "Value of j: " << j << endl;
}

int main() {
  B obj;
}

هنا في هذه الحاله الداله f سوف ترجع القيمه الصحيحه ، لأن A أكتملت تهيئته بشكل كامل ...

بالنسبه لـ Copy Construction فهي تستخدم عندما نريد انشاء كائن من خلال كائن أخر ، أيضا تستخدم عندما نمرر كائن بالقيمه وعندما نرجع الكائن بالقيمه أيضا .. ولا يفترض بك أعاده تعريفها الا في حالات خاصه ، مثل أن يكون لديك مؤشر في الكلاس ، ففي هذه الحاله يجب أن تعيد تعريفها حتى تجعل كل مؤشر يؤشر الى مكان مختلف عن الأخر في الذاكره.

هناك العديد من المواضيع هنا في القسم عن هذا الموضوع ، استخدم خاصيه البحث ..

بالتوفيق ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

مواضيع مشابهة