الإعــلام الآلي والرياضيــات يشتمل على جميع مبادئ الإعلام الآلي والرياضيــات

قديم 13-02-2009, 11:22 AM
  #1
MiMoO_Tz
مشرف سابق
 
تاريخ التسجيل: 24-06-2008
الدولة: جلالة وطن المحبـة
المشاركات: 197
MiMoO_Tz عضو يستحق التميز
افتراضي البرمجة غرضية التوجه







يسرني أن أقدم لكم أخواني الكرام هذه الدورة الطويلة بعض الشيء ، سيتم فيها بإذن الله شرح لما هي البرمجة غرضية التوجه أو ما يعرف بـ OOP ، وسيتم بإذن الله تعالى شرح لمواضيع عديدة ومتفرقة في هذا المجال ، من تلك الدروس التي سندرسها :



** مقدمة عامة تشمل المفاهيم الأساسية ومزايا البرمجة الشيئية .
** مستويات الحماية وإنشاء الأصناف واستدعاء الأعضاء ( البيانات والدوال ).
** مؤثر دقة الوصول ( :: ) Scope Resolution Operator .
** دوال البناء والهدم .( 1 و 2)
** المؤشر الحسابي & الحجز الديناميكي للذاكرة باستخدام new & delete .
** الكائنات والدوال الثابتة constant objects & constant Functions .
** المؤشر This .
** الأعضاء الساكنة static datda member.
** الدوال الصديقة friend functions .
** الأصناف الصديقة Friend Classes .
** الدوال الخطية Inline Functions.
** التحميل الزائد للدوال Function Overloading .
** التحميل الزائد للمؤثرات Operator Overloading .
** التحويل بين الأنواع Converting between types .
** الوراثة : أ: الوراثة الأحادية . ب: الوراثة المتعددة.

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





وكل أملي بإذن الله أن أكون قد اخترت ما يناسبكم وأن تنال هذه المواضيع على استحسانكم ورضاكم ..






البرنامج أو المترجم
الذي سنعمل عليه هو Dev - c++ أنقر هنا لزيارة الصفحة الرئيسية للمترجم .
ولتحميل البرنامج مباشرة .::




** معنى البرمجة الشيئية :: oop

هي عبارة عن أسلوب جديد من أساليب البرمجة حيث أصبحت وحدة بناء البرنامج هي الصنف class والذي يحوي على البيانات data والعمليات ( الدوال ) functions .
ولها عدة مسميات منها ..::
1- البرمجة غرضية التوجة .
2- البرمجة الكائنية الموجهة .


* أسلوب البرمجة الشيئية :.
عادة ما تكون البرامج من هذا الأسلوب معقدة بشكل كبير حيث تقسيم البرنامج إلى مجموعة من المهام الرئيسية ومن ثم تقسم إلى مهام فرعية على حسب درجة التعقيد للمهام الرئيسية لذلك فان البرمجة الهيكلية تنتهج النهج ( من الأعلى إلى الأسفل ) Top Down .



* عيوب هذا الأسلوب : البرمجة الهيكلية .::
1- صعوبة فصل البيانات على العمليات .
2- إعادة إنشاء الحلول وعدة إعادة استخدامها .



* المفاهيم الأساسية للبرمجة الشيئية :.

1- الكائن Object :

عبارة عن وحدة تحوي مجموعة من البيانات تسمي ( خصائص ) properties أو صفات ومعرفة عليها مجموعة من العمليات .
مثال .:: كائن السيارة .:

الخصائص :
Model :Ferrari
Color : Blue
Year : 2005

العمليات ::.
Start ' الانطلاق '
Stop ' التوقف '
Accelerate 'التسارع'



2- الصنف Class : الكائنات ذات الخصائص والأفعال المشتركة بحاجة لآن تجمع مع بعضها البعض حتى يمكن استخدامها في برنامج ما.
وبالتالي فإن الصنف : عبارة عن مجموعة من الكائنات التي تشترك في الخصائص والعمليات ..
مثلاً ..::
الطالب كائن >> الطلاب صنف .
الموظف كائن >> الموظفين صنف .



* مزايا البرمجة الشيئية :. Features of (opp)

1- التجريدabstraction : وهو عملية تحديد الخصائص والعمليات التي تنتمي لصنف معين وهي نوعان .::

أ- تجريد البيانات Data abstraction : وهي عملية التعرف على الخصائص المرتبطة بكائن معين .
ب- تجريد العمليات Methods abstraction: وهو عملية تحديد العمليات والإجراءات دون ذكر شيء عن كيفية أدائها .

2- التغليف ( الكبسلة )Encapsulation : هي عملية تجميع كل الخصائص properties والطرق ( العمليات ) Methods في وحدة واحدة ( داخل غلاف واحد ) حيث لا يمكن الوصول إليها ( أي الخصائص والطرق ) إلا عن طريق الكائن .

3- إخفاء البيانات Data Hiding:. وهي ميزة ناتجة عن كبسلة البيانات وتعني إضافة مستوى حماية معين على البيانات حتى نمنع وصول الخطأ إليها .

4- الوراثة Inhertance:. وهي أن يرث صنف ما الخصائص والعمليات الموجودة في الصنف الآخر مما يساعد على إعادة الاستخدام للأصناف التي تم إنشاؤها من قبل المستخدم . .



** أمثلة لبعض الأصناف المشتقة والأساسية في الوراثة :..



5- تعدد الأشكال ( الأوجه ) polymorfisme: تسمح ميزة تعدد الأشكال لنفس الدالة أن تتعرف بصورة مختلفة في أصناف مختلفة .
ويمكن عمل ذلك بـ الوراثة مع تعدد الأشكال .
واللغات التي تدعم أسلوب البرمجة الشيئية كثيرة نذكر منها ..
C++ و java و C# و vb.net



الدرس الثاني :..




** مستويات الحماية ( محددات الوصول للعضو ) .:

هي عملية تحديد مدى التعامل مع الأعضاء ( البيانات والعمليات ) . هل هذه الأعضاء خاصة بالصنف المعرفة فيه ، أم يمكن استخدام نطاق الصنف وهي ثلاث مستويات .::

1- مستوى الحماية الخاص private :
وفيه يتم تعريف الأعضاء التي يتم استخدامها في الصنف ، ولا يمكن الوصول إليها من خارج الصنف .

2- مستوى الحماية المحمي protected :
الأعضاء المعرفة في هذا المستوى تشبه الأعضاء الخاصة غير أنه يمكن توريثها إلى أي صنف آخر .

3- مستوى الحماية العام Public :
وفيه يتم تعريف الأعضاء العامة التي يمكن الوصول إليها من خارج الصنف .


* ملاحظات :.
1- دائماً تتبع محددات الوصول للعضو بنقطتين ( : ) مثلاً
كود
Private:

2- يمكن أن تظهر عدة مرات وبأي ترتيب في تعريف الصنف .
3- يتم إعادة تعريف البيانات الأعضاء في مستوى الحماية الخاص Private لأن من مبادئ البرمجة الشيئية " إخفاء البيانات " .
4- يتم إعادة تعريف الدوال الأعضاء في مستوى الحماية العام لآن هذه الدوال يتم استدعاؤها من خلال البرنامج الرئيسي .
5- من الممكن أن يكون لدينا بيانات عامة وعمليات خاصة غير أن هذا الاستخدام غير شائع .



** الأصناف Classes :



تعريف الصنف : هو عبارة عن وحدة تحوي مجموعة من البيانات ( الخاصة والعامة )بالإضافة إلى تعريف الدوال ( العمليات ) حيث يطلق على الدوال المعرفة داخل الصنف بـ " أعضاء دالية " member Function .



* الإعلان عن الصنف :



أمثلة :.

مثال 1: مثال على صنف الوقت .::
كود
class Time
{
private:
int hor ,minute ,second;
public:
void settime(int,int,int);
void printstandard ();
void printmilitary();
};




مثال 2 : مثال على صنف المستطيل :.

كود
class rectangle
{
int x,y;
public:
void set_value(int,int);
int area();
};


بمجرد تعريف الصنف يمكن استخدامه كنوع جديد حيث يطلق عليه ( نوع معرّف من قبل المستخدم).



** تعريف الكائنات .::

يتم تعريف الكائنات في البرنامج الرئيسي وفقاً للصيغة التالية :

كود
class_name object_name


حيث :
class_name : اسم الصنف ( نفس اسم الصنف الذي كتبناه في بداية البرنامج )
object_name : اسم الكائن ، وهو اختياري ، يستخدم للوصول لعناصر الصنف .



مثال.::
كود
rectangle rect;


حيث rectangle اسم الصنف ، و rect اسم الكائن .

وإذا أردنا أن نعرف أكثر من كائن بنفس الوقت ، نفس العملية السابقة ، فقط نفصل بين كل كائن والآخر باشارة الفاصلة ( , ) . والمثال التالي يوضح ما سبق .::

كود
rectangle rect1,rect2,rect3;




** استدعاء الأعضاء :.

أعضاء الصنف لا يمكن أن نصل إليها من خارج الصنف إلا عن طريق الكائنات ويتم ذلك بالصيغة التالية :
كود
Object_name.member


حيث .::
Object_name : اسم الكائن .
member : اسم العضو الذي نريد الوصول إليه .
مثال : إذا أردنا الوصول للدالة area() باستخدام الكائن rect نكتب الآتي :

كود
rect1.area()




البرنامج الأول : نقوم بكتابة برنامج يقوم بحساب مساحة المستطيل ( باستخدام الأصناف ) ..

كود
#include <iostream.h>
#include <cstdlib>
using Namespace std;
class rectangle
{
int x ,y;
public :
void set_value(int a,int b)
{
x=a;
y=b;
}

int area()
{
return x*y;
}
};
main()
{
rectangle rect1,rect2;
rect1.set_value(3,4);
rect2.set_value(5,6);
cout<<"Rect1 Area = "<<rect1.area()<<endl;
cout<<"Rect2 Area = "<<rect2.area()<<endl;
system("PAUSE");

}


شرح للبرنامج :.
في البداية عرفنا متغيرات خاصة Private وهما x ,y وهنا ملاحظة وهي طالما أننا عرفنا ذلك في بداية الصنف ولم نحدد مستوى الحماية فإن مستوى الحماية الإفتراضي هو Private .
بعد ذلك أنشأنا دالة باسم set_value بوسيطين في مستوى الحماية العام Public وظيفة هذه الدالة هي مساواة القيم التي يحددها المستخدم بالمتغيرات الخاصة ، أو بمعنى أخر وظيفتها الوصول للمتغيرات الخاصة x,y .
بعد ذلك أنشأنا دالة area() وظيفتها إرجاع مساحة المستطيل وهي عملية حسابية
الطول × العرض .
ثم في الدالة الرئيسية main() قمنا في البداية في باشتقاق كائنين rect1 و rect2 بعد ذلك قمنا باستدعاء دالة set_value وحددنا قيم الوسائط ..
ثم بعد ذلك استدعينا دالة حساب المساحة area() لكل من الكائنين rect1 ,rect2 .



** البرنامج الثاني : برنامج يقوم بحساب مساحة ومحيط الدائرة ( مستخدماً الأصناف ) .::
كود
#include <iostream.h>
#include <cstdlib>
using Namespace std;
class circle
{
private :
int r;
float area1,c;
public :
void get_r()
{
cout<<"Enter radius \n";
cin>>r;
}
void area()
{
area1=r*r*3.14;
}
void cir()
{
c=2*r*3.14;
}
void display ()
{
cout<<area1<<endl;
cout<<c<<endl;
}
};
main()
{
circle c;
c.get_r();
c.area();
c.cir();
c.display();
system("PAUSE");

}


نفس المثال السابق تقريباً من حيث الفكرة حيث :..
r = نصف القطر . area1=المساحة. c = المحيط .
cir = دالة ايجاد المحيط . display= طباعة المساحة والمحيط . area= المساحة .



تمرين ..:: أكتب برنامج يقوم بايجاد مضروب عدد مدخل من قبل المستخدم ( مستخدماً الأصناف ) ..




مؤثر دقة الوصول Scope Resolution Operator

عبارة عن مؤثر يستخدم عندما تكتب تفاصيل الدالة العضو خارج الصنف .

** الصيغة العامة للدالة التي تكتب خارج الصنف هي :

كود
DataType ClassName::FunctionName (Function Arguments )




** دوال البناء والهدم ::

أولا: دوال البناء Constructor Function .:::

هي عبارة عن دالة تحمل نفس اسم الصنف ويتم استدعاؤها مباشرة عند اشتقاق كائن من الصنف وتستخدم غالباً لإعطاء خصائص ( متغيرات ) الصنف قيم ابتدائية .



- ملاحظات :

1- لا يمكن تهيئة البيانات العضو أثناء التعريف .
2- لا يوجد مردود ( return ) لدوال البناء .
3- يمكن أن يحوي الصنف أكثر من دالة بناء ( التحميل الزائد للدوال ).



** مثال توضيحي لمؤثر دقة الوصول ودوال البناء .:

كود
#include <iostream.h>
#include <cstdlib>
using Namespace std;
//انشاء صنف باسم MYCLASS
class myclass
{
int a;
public:
myclass();
void show();
};
myclass::myclass()
{
cout<<"Constructor Function \n";
a=10;
}
void myclass::show()
{
cout<<"a="<<a<<"\n";
}
int main()
{
myclass ob;
ob.show();

system("PAUSE");
return 0;
}

والان شرح بسيط لاهم ما ورد في الكودالسابق :

كود
myclass();

الاعلان عن دالة بناء ( لان اسمها من اسم الصنف ) ولاحظ اننا وضعنا في نهاية تعريف الدالة فاصلة منقوطة ( ; ) وهذه نضعها في حال لم نريد كتابة تفاصيل الدالة داخل الصنف .
كود
myclass::myclass()

لاحظ اننا كتبنا هذا الكود بعد اقفال الكلاس .
لكتابة تفاصيل الدالة خارج الصنف نستخدم هذه الطريقة بحيث في البداية كتبنا اسم الصنف myclass ومن ثم مؤثر دقة الوصول وهو ( :: ) ومن ثم اسم الدالة myclass().(لاحظ هنا اننا نتحدث عن دالة البناء ، ودالة البناء ليس لها DataType عكس دالة show التي سترد الان ) .

كود
void myclass::show()

لاحظ هنا في البداية نكتب نوع الدالة DataType وهو Void الموجود في دالة show ، ومن ثم اسم الصنف ومؤثر دقة الوصول واسم الدالة ( كما في الدالة السابقة)


** دالة الهدمDestructor Function :
هي عبارة عن دالة عضو في الصنف ، ويتشكل اسمها من المحرف ( ~ ) مضافاً إليه اسم الصنف . وتستخدم لإنهاء الأعمال الداخلية للكائنات حتى يستطيع النظام استعادة الذاكرة لحفظ كائنات جديدة .

ملاحظات على دالة الهدم :

1- ليس لها وسائط ، ولا ترجع فيمة .
2- يمكن للصنف أن يحتوي على دالة هدم واحدة فقط .
3- لا يمكن تحميل دالة الهدم بشكل زائد.



** استخدام الوساط ( التلقائية ) الإفتراضية مع دالة :

يمكن أن يستخدم أي نوع أو أي عدد من المعاملات ( الوسائط) داخل دالة البناء ، في هذه الحالة يتم استدعاء دالة البناء للكائنات ذات المعاملات التي تتناسب مع عدد المعاملات الموجودة داخل دالة البناء .

مثال .:
كود
#include <iostream.h>
#include <cstdlib>
using Namespace std;
class myclass
{
private:
int x,y;
public:
myclass()
{
x=y=1;
}
myclass(int a ,int b)
{
x=a;
y=b;
}
void display()
{
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
}
};

int main()
{
int n,m;
cin>>n>>m;
myclass ob1;
ob1.display();
myclass ob2(n,m);
ob2.display();
system("PAUSE");
return 0;
}


توضيح بسيط لأهم ما ورد في هذا الكود :
في البداية يطلب البرنامج من المستخدم ادخال عددين ليسجلهما في المتغيرين m,n ..
و عند اشتقاق الكائن الأول وهو ob1 كما يظهر هنا ::..
كود
myclass ob1;

فإنه يتم مباشرة استدعاء التعليمات المكتوبة داخل دالة البناء myclass وهي ::.
كود
myclass()
{
x=y=1;
}

أي يجعل قيمة x و y تساوي العدد ( 1 ) .
ومن ثم استدعاء دالة الطباعة للكائن ob1 كما في هذا الشكل :.
كود
ob1.display();

بعد ذلك تم اشتقاق كائن اخر من الصنف myclass باسم ob2 وله وسيطتين وهما العددين الذين ادخلهما المستخدم في بداية البرنامج .::
كود
myclass ob2(n,m);
ob2.display();

ليتم بعدها طباعة العددين m,n من خلال دالة الطباعة display()



** متى تستدعى دوال البناء والهدم ؟!

1- يعتمد الترتيب الذي يستدعى به هذه الدوال على ترتيب الذي يدخل فيه التنفيذ أو يخرج من المجال الذي عرفت فيه الكائنات .
2- بشكل عام . يتم استدعاء دوال الهدم بترتيب معاكس لدوال البناء غير أنه يمكن أن يتغير هذا الترتيب في بعض الحالات ( ستذكر في السياق |38|)
3- تستدعى دوال البناء للكائنات المعرفة في المجال العام وقبل تنفيذ أي دالة بما فيها الدالة Main() .
4- تستدعى دوال الهدم المقابلة عندما تنتهي الدالة main().
5- تستدعى دوال البناء للكائنات المحلية التلقائية عندما يصل التنفيذ إلى النقطه التي عرفت فيها الكائنات .
6- تستدعى دوال الهدم المقابلة عندما تغادر الكائنات المجال الذي عرفت فيه .
7- تستدعى دوال البناء للكائنات المحلية الساكنة عندما يصل التنفيذ إلى النقطة التي عرّفت فيها الكائنات وتستدعى دوال الهدم المقابلة عند انتهاء الدالة Main() .



** برنامج يوضح لك النقاط السابقة حتى تتضح الرؤية حول كيفية الاستدعاء |40|

كود
#include <iostream.h>
#include <cstdlib>
using Namespace std;
class createAndDestroy
{
private:
int data;
public:
createAndDestroy (int);
~createAndDestroy();
};
createAndDestroy::createAndDes troy(int value)
{
data=value;
cout<<"object "<<data<<" Constructor \t";
}
createAndDestroy::~createAndDe stroy()
{
cout<<"object"<<data<<"destruc tor"<<endl;
system("PAUSE");
}
void create();
createAndDestroy first(1);


int main()
{
cout<<"global object before main"<<endl;
createAndDestroy second(2);
cout<<"Local Automatic in main"<<endl;
static createAndDestroy third(3);
cout<<"Local Static in main"<<endl;
create();
createAndDestroy fourth(4);
cout<<"Local Aotumatic in main"<<endl;

system("PAUSE");
return 0;
}


void create()
{
createAndDestroy fifth(5);
cout<<"Local Aotumatic in Create \n";
static createAndDestroy sixth(6);
cout<<"Local Static in create \n";
createAndDestroy seventh(7);
cout<<"Local Automatic in Create \n";
system ("PAUSE");
}


وهذا هو شكل المخرجات :



توضيح بسيط للبرنامج :.

في البداية يقوم بتنفيد دوال البناء لكل من ( 1 ، 2 ، 3 ) بعدها يقفز للأسفل لقراءة تفاصيل الدالة Create();فيقرأ كل من ( 5 ، 6 ، 7 )
وبعدها بعملية عكسية يتم الهدم "مثل ما ذكر سابقاً" فيتم الهدم لكل من ( 7 )
وبعدها لا يحدف (6) لانه ساكن Static فينتقل للتي بعدها وهي ( 5) فيتم هدمها وبعد ذلك يعود للبرنامج الرئيسي فيقوم بتنفيذ ( 4 ) ومن بعدها تنتهي الدالة Main() فيقوم البرنامج بالهدم بعملية عكسية أيضاً فيهدم ( 4 ) ومن ثم ( 2) " 3 لا يهدم لانه ساكن حاله حال 6 " ومن بعدها يهدم الدالة 2 ..
الان يهدم وبعد الانتهاء من هدم الدوال العامة يعود لهدم الدوال الساكنة فيهدم ( 6 ) ومن بعدها يهدم الدالة رقم ( 3 ) .. وفي الأخير يتم هدم الدوال العامة ولا يوجد لدينا الا دالة واحده وهي ( 1 ) .


* المؤشر الحسابي :

عند الحديث عن مؤشر الكائن يظهر مفهوم جديد وهو المؤشر الحسابي ونقصد به : أن مؤشر الكائن ربّما يخضع لبعض العمليات مثل :
1- ( ++ ) وتعني زيادة قيمة المؤشر Increment وتستخدم لجعل المؤشر يشير إلى الموقع التالي..
2- ( -- ) وتعني إنقاص المؤشر Decrement وتستخدم لجعل المؤشر يشير إلى الموقع السابق .
مثال :
كود
#include <iostream>
#include <cstdlib>
using Namespace std;
class samp
{
int a, b;
public:
samp(int m,int n)
{
a=n;
b=m;
}
int get_a()
{
return a;
}
int get_b()
{
return b;
}
};
int main()
{
samp ob[4]={samp(1,2),samp(3,4),samp(5,6 ),samp(7,8)};
samp *x;
x=&ob[0];
for (int i=0;i<4;i++)
{
cout<<x -> get_a()<<"\t"<<x -> get_b()<<"\n";
x++;
}
system("PAUSE");
return 0;
}

في هذا المثال لدينا مصفوفة من الكائنات كما يظهر في الكود :

كود
samp ob[4]={samp(1,2),samp(3,4),samp(5,6 ),samp(7,8)};


ولدينا المؤشر للعنصر الأول :
كود
samp *x;
x=&ob[0];


اذا فنحن نستطيع التنقل الى الكائنات الأخرى من خلال Pointer Arithmatic وهو في حالتنا هذه x++ أي أذهب الى الكائن الأخر في المصفوفه وهكذا إلى ان يصل للكائن الأخير وستكون المخرجات بالشكل التالي :..

1 2
3 4
5 6
7 8

( المثال من تعديل وتوضيح استاذنا الفاضل romansy )



الحجز الديناميكي للذاكرة باستخدام new & delete :

في لغة C++ نستخدم المؤشر new لحجز الذاكرة الديناميكية و delete لإلغائها .
- الصيغة العامة لحجز ذاكرة وإلغائها لكائن واحد هي :.
كود
p-var=new type;
delete p-var;


أما في حالة عدة مواقع فإننا نستخدم الصيغة التالية :.
كود
p-var = new type[size];
delete[] p-var;

حيث Type تحدد النوع ( اسم الصنف ) ، وP-Var مؤشر النوع .



مثال على حجز موقع واحد وإلغائه .:::( لابد أن تكون مطلع على موضوع المؤشرات والمراجع )

كود
#include <iostream.h>
#include <cstdlib>
using Namespace std;
class samp
{
int i ,j;
public:
void set_ij(int a , int b)
{
i=a;
j=b;
}
int get_product()
{
return i*j;
}
};
int main()
{
samp *p;
p= new samp;
p -> set_ij(4,5);
cout<<p -> get_product()<<"\n";
delete p;

system("PAUSE");
return 0;
}


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

كود
#include <iostream.h>
#include <stdlib.h>
class samp
{
int i ,j;
public:
void set_ij(int a , int b)
{
i=a;
j=b;
}
int get_product()
{
return i*j;
}
};
int main()
{
samp *p;
int n;
cin>>n;
p=new samp[n];
for ( int i=0;i<n;i++)
{
p -> set_ij(i,i);
cout<<p -> get_product()<<"\n";
}
delete []p;

system("PAUSE");
return 0;
}

وهذاالمثال كما ذكرت نفس المثال السابق ولكن لعدة مواقع بحيث في البداية يتم ادخال رقم ( مثلاُ 7 ) ومن يقوم بطباعة حاصل ضرب الأعداد في نفسها من 1 إلى 6 ( 1*1 ، 2*2 ، ... ، 6*6) وتظهر المخرجات كما في الشكل التالي:



مساواة الكائنات :

يمكن مساواة كائن بكائن أخر مثلاً إذا كان لدينا كائنين A و B إذا جعلنا ( A=B ) فهذه العملية تعني نسخ محتويات الكائن B بالكائن A .

ملاحظات :
1- يجب أن تكون الكائنات من نفس النوع وإلا أدى ذلك إلى خطأ .
2- يمكن إرسال الكائن كوسيطة للدالة ، كما يمكن إرجاعه من الدالة .



مثال :
كود
#include <iostream.h>
#include <cstdlib>
using Namespace std;
class date
{
int day,mounth,year;
public:
date(int=1,int=1,int=1990);
void print();
};
date:: date(int m,int d,int y)
{
mounth=m;
day=d;
year=y;
}
void date::print()
{
cout<<mounth<<"_"<<day<<"_"<<y ear;
}
int main()
{
date date1(7,4,1993),date2;
cout<<" date1= ";
date1.print();
cout<<"\n date2= ";
date2.print();
date2=date1;
cout<<"\n date2= ";
date2.print();
cout<<"\n";
system("PAUSE");
return 0;
}


كما هو ظاهر في هذا المثال وهو خاص بطباعة التاريخ ، قمنا في البداية بتعريف دالة بناء افتراضية ذات ثلاثة معاملات وهي اليوم والشهر والسنة ، ومن ثم قمنا بتعريف دالة للطباعة .
قمنا بعدها باشتقاق كائنين الأول date1 قمنا من خلاله بإرسال المعاملات أو الوسائط وهي اليوم والشهر والسنة(7,4,1993) ، والكائن الثاني date بدون وسائط ( بحيث ينفذ الوسائط التلقائية الموجودة في دالة البناء وهي 1-1-1990) .
بعدها قمنا بطباعة محتويات الكائن الأول وهي 7-4-1993ومن ثم طباعة محتويات الكائن الثاني وهي 1-1-1990
بعد ذلك قمنا بنسخ محتويات الكائن date1 بالكائن date2 كما يظهر في هذا الكود
كود
date2=date1;


بعد ذلك قمنا بطباعة محتويات الكائن الثاني لتظهر لنا 7-4-1993 .



* إرسال الكائن إلى دالة :


تسمح لغة C++ بإرسال الكائنات إلى الدوال كما يتم إرسال المعاملات البسيطة ، ويمكن توضيح ذلك في المثال التالي:

كود
#include <iostream.h>

#include <cstdlib>

using Namespace std;

class sample

{

int i;

public:

sample (int n)

{

i=n;

}

int get_i()

{

return i;

}};



int sqr_i(sample ob)

{

return ob.get_i()*ob.get_i();

}

int main()

{

sample s1(2),s2(10);

cout<<sqr_i(s1)<<endl;

cout<<sqr_i(s2)<<endl;



system("PAUSE");

return 0;

}

توضيح مبسط لأهم ما ورد في الكود السابق :

كما يتضح من خلال هذا البرنامج البسيط والذي يقوم بطباعة حاصل ضرب العدد بنفسه .
ظهر في هذا المثال الدالة التالية :

كود
int sqr_i(sample ob)


الدالة sqr_i له وسيطة واحدة وهي الكائن ob المشتق من الصنف sample ،حيث يتم من خلال هذا الكائن الوصول للدوال الموجودة داخل الصنف sample فكما ظهر قمنابالوصول للدالة get_i() والتي وظيفتها الوصول للمتغيرات الموجودة في مستوى الحماية الخاص Private .
بعد ذلك قمنا باشتقاق كائنين s1 الذي يرسل القيمة ( 2 ) لدالة البناء sample بعد ذلك يتم طباعة حاصل العدد (2) في نفسه من خلال الدالة sqr_i التي تستقبل وسيطة واحدة وهي الكائن s1 .
وكذا الحال مع الكائن الاخر s2 .









MiMoO_Tz غير متواجد حالياً  

الكلمات الدلالية (Tags)
البرمجة, التوجه, غرضية

أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة

الانتقال السريع

المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
التوجه المنظومي نحو التنمية المستدامة فؤاد هيثم التهيئة العمرانية 1 29-07-2013 12:12 PM
أمور ستتمنى لو أنك عرفتها قبل التوجه إلى مقابلة العمل – موضوع مصوّر صاحبة السمو منتدى اعلانات التوظيف 3 22-04-2012 06:39 PM
ما هي البرمجة ؟ آلاء الرحمن منتــدى البرمجــة العـــام 2 23-06-2011 11:27 AM
أحد أهم مفاهيم البرمجة : ( البرمجة تركز على المعنى والنتيجة ) !! عادل العاشق التنمية البشريه 1 12-09-2008 07:42 AM
التعليم و التوجه نحو إقامة مجتمع المعرفة JAMALFA موسوعة البحوث : ضع طلبك هنا 0 20-05-2008 10:26 AM


الساعة الآن 12:44 PM.
Powered by vBulletin® Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. , TranZ By Almuhajir