تفاوتها و شباهتهای c++,java
مقدمه:
زبان C پس از تولد ، شوك بزرگي به دنياي كامپيوتر وارد كرد . اين زبانبطور
اساسي شيوه هاي تفكر و دستيابي به برنامه نويسي كامپيوتر را دگرگون ساخت . تولد C
ناشي از نياز به يك زبان ساخت يافته ، موثر و سطح بالا بعنوان جايگزينيبراي
كدهاي اسمبلي و پياده سازي برنامه نويسي سيستم بود . هنگاميكه يك زبانبرنامه
نويسي جديد متولد ميشود ، مقايسه ها شروع خواهد شد . مقايسه ها براساسمعيارهاي
زير انجام مي گيرند :
* راحتي كاربري در مقايسه با قدرتمندي زبانبرنامه نويسي
* ايمني در مقايسه با سطح كارآيي
* استحكام در مقايسه باتوسعه پذيري
قبل از ظهور زبان C برنامه نويسان با زبانهايي كار مي كردند كهقدرتبهينه سازي يك مجموعه خاص از خصايص را داشتند . بعنوان مثال هنگاميكه از فرترن براي نوشتن برنامه هاي موثر در كاربردهاي علمي استفاده مي كنيم ، برنامههايحاصله براي كدهاي سيستم چندان مناسب نيست. زبان بيسيك با اينكه براحتيآموختهمي شود ، اما قدرت زيادي نداشته و عدم ساخت يافتگي آن در برنامه هايبزرگ مشكلآفرين خواهد شد . از زبان اسمبلي براي توليد برنامه هاي كاملا" موثر استفادهمي شود ، اما آموزش و كار با اين زبان بسيار مشكل است . بعلاوه اشكالزداييكدهاي اسمبلي بسيار طاقت فرساست . مشكل اصلي ديگر اين بود كه زبانهاياوليه برنامه نويسي نظير بيسيك ، كوبولو فرترن براساس اصول ساخت يافته طراحينشده بودند . اين زبانها از Goto عنوانابزارهاي اوليه كنترل برنامه استفادهمي كردند . در نتيجه ، برنامه هاي نوشته
شده با اين زبانها توليد باصطلاح " كدهاي اسپاگتي "(spaghetti code() مي كردندمنظور مجموعه اي در هم تنيده ازپرشها و شاخه هاي شرطي است كه درك يك برنامهطولاني را ناممكن مي سازد . اگر چهزبانهايي نظير پاسكال ، ساخت يافته هستنداما فاقد كارايي لازم بوده و جنبه هاي ضروري براي كاربرد آنها در طيف وسيعي ازبرنامه ها وجود ندارد . ( بخصوص ويرايش پاسكال) استاندارد فاقد ابزارهاي كافيبراي استفاده در سطح كدهاي سيستم بود ) تا قبل از ابداع زبان C )، زبان ديگري قدرت نداشت تا خصلتهاي متضادي كه درزبانهاي قبلي مشاهده مي شد، را يكجا گردآوري كند . نياز به وجود يك چنين زبانيشديدا" احساس ميشد. در اوايل دهه 1970 ميلادي ، انقلاب رايانه اي در حال شكلگيريبود و تقاضا براي انواع نرم افزارها فشار زيادي روي برنامه نويسان وتواناييهايايشان اعمال ميكرد. درمراكز آموزشي تلاش مضاعفي براي ايجاد يك زبانبرنامه نويسيبرتر انجام مي گرفت . اما شايد از همه مهمتر توليد و عرضه انبوهسخت افزار
كامپيوتري بود كه بعنوان يك نيروي ثانويه روي زبانهاي برنامه نويسيعمل ميكرد. ديگر رايانه ها و اسرار دروني آنها پشت درهاي بسته نگهداري نمي شد . براي اولينبار بود كه برنامه نويسان واقعا" دسترسي نامحدودي به اسرار ماشينهايخود پيدانمودند . اين امر زمينه تجربيات آزادانه را بوجود آورد . همچنينبرنامه نويسانتوانستند ابزارهاي مورد نيازشان را ايجاد نمايند .
براي بررسي تاريخچه بايد به سال 1967 بازگرديم که مارتين ريچاردز زبان BCPL را براي نوشتن نرم افزارهاي سيستم عامل و کامپايلر در دانشگاه کمبريج ابداع کرد. سپس در سال 1970 کن تامپسون زبان B را بر مبناي ويژگيهاي زبان BCPL نوشت و از آن براي ايجاد اولين نسخه هاي سيستم عامل Unix در آزمايشگاههاي بل استفاده کرد. زبان C در سال 1972 توسط دنيس ريچي از روي زبان B و BCPL در آزمايشگاه بل ساخته شد و ويژگيهاي جديدي همچون نظارت بر نوع داده ها نيز به آن اضافه شد. ريچي از اين زبان براي ايجاد سيستم عامل Unix استفاده کرد اما بعدها اکثر سيستم عاملهاي ديگر نيز با همين زبان نوشته شدند. اين زبان با سرعت بسياري گسترش يافت و چاپ کتاب "The C Programming Language" در سال 1978 توسط کرنيگان و ريچي باعث رشد روزافزون اين زبان در جهان شد.
متاسفانه استفاده گسترده اين زبان در انواع کامپيوترها و سخت افزارهاي مختلف باعث شد که نسخه هاي مختلفي از اين زبان بوجود آيد که با يکديگر ناسازگار بودند. در سال 1983 انستيتوي ملي استاندارد آمريکا (ANSI) کميته اي موسوم به X3J11 را را مامور کرد تا يک تعريف فاقد ابهام و مستقل از ماشين را از اين زبان تدوين نمايد.در سال 1989 اين استاندارد تحت عنوان ANSI C به تصويب رسيد و سپس در سال 1990، سازمان استانداردهاي بين المللي (ISO) نيز اين استاندارد را پذيرفت و مستندات مشترک آنها تحت عنوان ANSI/ISO C منتشر گرديد.
با ظهور زبان C ، زمينهجهشهاي بزرگ در زبانهاي برنامه نويسي مهيا بسياري معتقدند كهايجاد زبان C راهگشاي دوران جديدي در زبانهاي برنامه نويسيبوده است . اين زبانبطور موفقيت آميزي تناقضهاي موجود در زبان هاي برنامه نويسيقبلي را مرتفع نمود . نتيجه فرآيند ايجاد زبان C ، يك زبان قدرتمند ، كارا وساخت يافته بود كهبراحتي قابل آموزش و فراگيري بود . اين زبان يك ويژگي غيرمحسوس اما مهم داشت : زبان C ، زبان برنامه نويسان بود . قبل از ابداع زبان C زبانهاي برنامه نويسييا جنبه هاي آموزشي داشته يا براي كارهاي اداري طراحيميشد . اما زبان C چيزديگري بود . اين زبان توسط برنامه نويسان واقعي و درگيربا كارهاي جدي ، طراحيو پياده سازي شده و توسعه يافت . جنبه هاي مختلف اينزبان توسط افرادي كه باخود زبان سر و كار داشته و برنامه نويسي مي كردند موردبررسي ، آزمايش و تفكر وتفكر مجدد قرار گرفته بود .
اصل اين فرآيند هم زبانيبود كه برنامه نويسان آنرا دوست داشتند. در حقيقت زبان C بسرعت مورد توجهبرنامه نويسان قرار گرفت تاجايي كه برنامه نويسان نسبت به C تعصب خاصي پيدانمودند . اين زبان مقبوليت ومحبوبيت زيادي در بين برنامه نويسان يافت . بطورخلاصه زبان C توسط برنامهنويسان و براي برنامه نويسان طراحي شده است .
نياز به++C طي دهه 1970 واوايل دهه 80 ميلادي زبان C نگين انگشتري برنامه نويسان بود و
هنوز هم در سطحوسيعي مورد استفاده قرار مي گيرد . از آنجاييكه C يك زبان موفقو سودمند بوده ،ممكن است بپرسيد چه نيازي به زبانهاي جديدتر وجود داشته است . پاسخ شما يك كلمهيعني پيچيدگي (Complexity) است . طي تاريخ كوتاه برنامه نويسيپيچيدگي فزايندهبرنامه ها نياز براي شيوه هاي بهتر مديريت پيچيدگي را بوجودآورده است . ++C پاسخي است به اين نياز مديريت پيچيدگي برنامه ها كه زمينه اصليپيدايش++C بودهاست . شيوه هاي برنامه نويسي از زمان اختراع رايانه تاكنون بطور قابل توجهيتغييرنموده اند . بعنوان مثال ، هنگاميكه رايانه ها اختراع شدند ، برنامهنويسي بااستفاده از دستور العملهاي باينري (Binary) ماشين انجام مي گرفت . ماداميكه برنامه ها شامل حدود چند دستور العمل بود ، اين روش كارآيي داشت .
بموازات رشد برنامه ها زبان اسمبلي ابداع شد تا برنامه نويسان بتوانند برنامههايبزرگتر و پيچيده تر را با استفاده از نشانه هايي كه معرف دستورالعملهايماشينبودند ، بنويسند . اما پيشرفت و رشد برنامه ها همچنان ادامه يافت وزبانهاي سطحبالايي معرفي شدند كه ابزارهاي مناسب براي مديريت پيچيدگي روزافزونبرنامه ها رادر اختيار برنامه نويسان قرار مي دادند .
اولين زبان مطرح دراين زمينه فرترن بود . اگر چه فرترن اولين گام در اين مسير بود، اما زباني استكه توسط آن برنامه هاي تميز و سهل الادراك نوشته مي شود.
در دهه 1960 ميلاديبرنامه نويسي ساخت يافته مطرح شد . با استفاده از زبانهايساخت يافته، براياولين بار امكان راحت نوشتن برنامه هاي بسيار پيچيده بوجودآمد . اما حتي باوجود روشهاي برنامه نويسي ساخت يافته ، هنگاميكه يك پروژه بهاندازه معيني ميرسيد ، پيچيدگي آن از توان مديريت برنامه نويس خارج مي شد . دراوائل دهه 1980ميلادي بسياري از پروژه هاي مديريت برنامه نويسي از مرزهايبرنامه نويسي ساختيافته گذشتند . براي حل اين قبيل مشكلات ، يك روش نوينبرنامه نويسي ابداع شد . اين روش را برنامه نويسي شي گرا يا باختصار oop مي نامند .
توصيف مختصراين روش عبارت استاز : oop يك نوع روش شناسي برنامه نويسي است كهامكان سازماندهي برنامه هايپيچيده از طريق بهره گيري از سه روش : وراثت ، كپسولسازي و چند شكلي ، راايجاد مي كند . در تحليل نهايي ، اگر چه C بزرگترين و مهمترين زبان برنامهنويسي جهان استاما محدوديتهايي در مديريت پيچيدگي برنامه ها دارد . هنگاميكهيك برنامه ازمحدوده 25000 تا 100000 خط از كدها تجاوز نمايد، آنچنان پيچيده ميشود كه دركآن بعنوان يك برنامه كلي ناممكن خواهد شد. ++C اين محدوديت را ازبين برده وبه برنامه نويس كمك مي كند تا برنامه هايي از اين بزرگتر را نيز دركو مديريتنمايد.
++C در سال 1979 ميلادي توسط Bjarne stoustrup هنگاميكه درآزمايشگاه بل در Marry Hill ايالت New jersy مشغول كار بود ، ابداع شد . او درابتدا اين زبانجديد را (C with classes) ناميد . اما در سال 1983 ميلادي ناماين زبان جديد به ++ Cتغيير يافت++C. تداوم زبان C بود كه جنبه هاي oop نيز بهآن اضافه مي شد. از آنجايي كه زبان++C براساس زبان C شكل گرفته ، در بر گيرندهكليه جنبه هاخسلتها (attributes) و مزاياي زبان C مي باشد . اين عوامل دلايلقاطعي برايموفقيت حتمي++C عنوان يك زبان برنامه نويسي هستند . ابداع++C درحقيقت تلاشيبراي ايجاد يك زبان كاملا" جديد برنامه نويسي نبود. در حقيقت پروژه++C منجر بهافزايش تواناييهاي زبان موفق C شد . چون++C از ابتداي تولدتاكنون داراي روايتهاي گوناگوني شده است ، در حالحاضر در تلاش استاندارد نمودناين زبان هستند.
با گسترش شبکه و اينترنت، نياز به زباني احساس شد که برنامه هاي آن بتوانند برروي هر ماشين و هر سيستم عامل دلخواهي اجرا گردد. شرکت سان مايکروسيستمز در سال 1995 ميلادي زبان Java را برمبناي C و ++C ايجاد کرد که هم اکنون از آن در سطح وسيعي استفاده مي شود و برنامه هاي نوشته شده به آن برروي هر کامپيوتري که از Java پشتيباني کند(تقريبا تمام سيستمهاي شناخته شده) قابل اجرا مي باشد. شرکت مايکروسافت در رقابت با شرکت سان، در سال 2002 زبان جديدي بنام #C(سي شارپ) را ارائه داد که رقيبي براي Java بشمار مي رود.
زمينه هاي پيدايش جاوا
تاريخچه زبانهاي برنامه نويسي بشرح زير است : زبان B منجر به ظهور زبان C و C
زمينه پيدايش C++ شد و در نهايت زبان جاوامتولد شد . درك زبان جاوا مستلزم :
درك زمينه هاي لازم براي ايجاد جاوا ،نيروهايي كه اين زبان را شكل داده اند و
مشخصاتي است كه اين زبان از اسلاف خودبه ارث برده است . نظير ساير زبانهاي
برنامه نويسي موفق ، جاوا نيز عناصر بارثبرده از اسلاف خود را با ايده هاي
ابتكاري كه ناشي از محيط منحصر بفرد اين زبانبوده درهم آميخته است . فصول بعدي
جنبه هاي عملي زبان جاوا شامل دستور زبان (syntax) و كتابخانه ها (libraries)
و كاربردهاي جاوا را توصيف مي كند . فعلا" چگونگي و علت ظهور جاوا و اهميت آن
را بررسي مي كنيم .
اگر چه جاوا تفكيكناپذيري با محيط هاي همزمان اينترنت پيوستگي دارد ، اما
بخاطر بسپاريد كه جاواقبل از هر چيز يك زبان برنامه نويسي است . ابداعات و
پيشرفت ها در زبانهايبرنامه نويسي كامپيوتر بدو دليل بروز مي كنند :
- تطابق با تغييرات محيط ها وكاربردها .
- ايجاد پالايش و پيشرفت در هنر برنامه نويسي .
پاسخ : تفاوتها و شباهتهای c++,java
مفهوم Object ( شيء) و خصوصيات آن
ما چه چيزهايي را Object ميگوييم. هر چيزي كه از خود "وجود" داشته باشد و به واسطه اين "وجود،" ما بتوانيم آن را درك كنيم، بشناسيم يا به عنوان يك موجود مستقل با آن ارتباط برقرار كنيم Object ناميده ميشود؛ مثلاً، ميز، ديوار، كامپيوتر، يا يك ويديوي Sony x50 و... .
نكته بسيار مهم كه بايد در نظر بگيريم اين است كه Objectها لزوماً قابل لمس (Tangible) نيستند؛ براي نمونه در نظر بگيريد كه به فروشگاهي ميرويد و يك "خريد" انجام ميدهيد. "خريد" هم يك Object به حساب ميآيد، زيرا چيزي است كه وجود دارد و به عنوان يك چيز مستقل قابل درك ميباشد.
شيي ء کليدي ترين مفهوم برنامه نويسي شي گرا است هر شي ء يک حالت و رفتار دارد و برنامه عبارت است از بر هم کنش بين اشياء . حالت يک شي ء عبارت است از متغيرهاي عناصر داده اي شييء و مقدار آنها . رفتار يک شي ء را متدهاي آن تعيين مي کند . شيء در واقع مقداري کد است که کار خاصيتي انجام مي دهد .
هر شيء کپسولي است از مقداري متغير و کد که کار نگهداري و به روز در آوردن آنها را ساده مي کند . معمولاً درون يک شيء از دسترس دنياي خارج به دور است و براي کار با آن بايد از ارسال پيام استفاده کرد . مزيتش آن است که کاربر براي کار با آن هيچ نيازي به دانستن مکانيزم هاي دروني آن ندارد و فقط بايد ساختار پيام ها را بداند . معمولاً ساختار پيام ها در اشياء مختلف يکسان است . در دنياي واقعي هم وضع به همين منوال است مثلاً براي استفاده از يک تلويزيون شما هيچ نيازي به آشنايي با پيچيدگيهاي درون آن نداريد فقط کافي است بدانيد که بايد آن را به برق زده و روشن کنيد و يک کانال را انتخاب کنيد . کلاس در واقع الگويي است براي ايجاد شيء .
پاسخ : تفاوتها و شباهتهای c++,java
Class و Objectهاي هر Class
دستگاه ويديوي Sony x50 را به ياد آوريد. آيا ممكن است در جهان يك ويديوي Sony x50 وجود داشته باشد كه ظاهر و طرز كار يا امكاناتي كه دارد، با ديگران تفاوت داشته باشد؟ اگر چنين باشد ما ديگر آن را يك Sony x50 خطاب نميكنيم، چرا كه ميدانيم همه Sony x50 ها "بايد" مثل هم باشند، زيرا همه از يك رده، خانواده، يا اصطلاحاً يك Class هستند. وقتي كه در كارخانه Sony طرح ويديوي x50 را به دست ميآورند و در آن طرح همه خصوصيات و قابليتهاي سيستم مزبور را در نظر ميگيرند، در واقع Class اين ويديو را طراحي ميكنند و طبعاً هر ويديويي كه از روي اين طرح ساخته شود، بدون استثناي، تمام خصوصيات پيشبيني شده در اين طرح را خواهد داشت.
هر ويديويي كه از روي اين طرح به وجود ميآيد، يك Object از Class ، ويديوي Sony x50 به حساب ميآيد.
يك نكته بسيار مهم كه در مورد Objectهاي هر Class مطرح است، مساله استقلال اين Objectها ميباشد. فرض كنيد دو دستگاه ويديوي Sony x50 در منزل شما وجود دارد. هر دو اين ويديوها از Objectهاي يك كلاس به حساب ميآيند، ولي رفتارهايي كه از خود بروز ميدهند، كاملا مستقل از يكديگر است؛ مثلا زدن دكمه Play يكي از آنها سبب روشن شدن ديگري نميشود. البته بايد توجه داشت كه در برنامه سازي شيء گرا، همه برنامهنويسان اين موارد را رعايت نميكنند و از طرف ديگر هم بعضي زبانهاي برنامهسازي امكاناتي در اختيار برنامهنويسان قرار ميدهند كه ناقض بعضي از مفاهيم شيء گرايي ميباشند. نمونه اين موارد را خواهيم ديد.
محدود کننده اعضاي يک کلاس
public –> بدون هيچ محدوديتي
Private –> براي ساير اعضاي يک کلاس در دسترس هستند و کاربر نمي تواند به آن دسترسي داشته باشد.
تاريخچه زبان هاي شيئ گرا
Simula I و Simula67 اولين زبان هاي شيئ گرا که در سال 1965 توسط KristenNygard و Ole-john Dahl در نروژ پديد آمد.
Small Talk در سال 1970
در سال هاي 1980 تا 1983 وارد زبان C شد و ++C شکل گرفت.
و اکنون C#, C++, JAVA, ……
پاسخ : تفاوتها و شباهتهای c++,java
وراثت(Inheritance)
ارث بري در طبيعت هم وجود دارد . هر فرزند خصوصيات والد خود را به ارث مي برد و يک خصوصيات اضافه تري نيز دارد.کلاس پايه را Base Class و کلاس مشتق شده را Drived Class مي نامند . نحوه ي ارث بري هم به 2 گونه Public يا Private مي باشد.
Inheritance از جمله مفاهيم بسيار مهم در شيء گرايي به حساب ميآيد. براي درك هر چه بهتر اين مفهوم به مثال زير توجه فرماييد:
در جهان وسايل نقليه مختلفي وجود دارند كه هر يك به نحوي به ما در جابهجايي كمك ميكنند. هواپيما، قطار، ماشين، كشتي، موتورسيكلت، دوچرخه و ... همه از وسايل نقليه به شمار ميآيند. يك نكته در اينجا پر واضح است و آن اينكه اگر از اين ديدگاه بالا بنگريم، جز وسيله نقليه بودن، اين وسايل ربط خاصي به هم ندارند. پس چه چيز سبب ميشود تا ما همه را وسيله نقليه بخوانيم؟ پاسخ بسيار ساده است: Abstraction؛ يعني تمام خصوصيات غير مشترك را كنار گذاشتن و قرار دادن اشياء در يك دسته به خاطر وسيله نقليه بودن (خصوصيت مشترك.)
نتيجه اين مثال اين است كه Inheritance با Abstraction رابطه مستقيم دارد. حال با يك ديد برنامهنويسي مساله را بيشتر باز ميكنيم. يك Class به نام Vehicle در نظر بگيريد. تمام وسايلي كه در بالا نام برده شد، Objectهايي از اين Class به حساب ميآيند. در برنامه نويسي به اينگونه Classها كه در بالاترين سطح Abstraction قرار مي’گيرند، Base Class يا Super Class گفته ميشود. از يك ديدگاه ديگر ميتوان وسايل نامبرده را به سه دسته هوايي، زميني و دريايي تقسيم كرد. اينجاست كه Objectها در دستههاي مختلف قرار ميگيرند. توجه داشته باشيد كه همچنان بعد از اين تقسيمبندي جديد، تغييري در دستهبندي اول به وجود نميآيد. اگر دقت كنيد متوجه ميشويد كه وسايل نقليه زميني، وسايل نقليه هوايي و وسايل نقليه دريايي هر سه زيرمجموعههاي وسايل نقليه هستند. به اينها Derived Class يا Sub Classهاي Vehicle ميگويند.
تا هر عمقي كه بخواهيم ميتوانيم اين سلسله مراتب را ادامه دهيم. از آن جهت آن را وراثت ميخوانيم كه هر Sub Class تمام خصوصيات Super Class خود را داراست؛ مثلاً Sub Class اتومبيل BMW زيرمجموعه Class اتومبيلهاي سواري به حساب ميآيد، پس تمام خصوصياتي را كه براي يك اتومبيل سواري تعريف ميشود، داراست. البته علاوه بر آن خصوصيات مشترك، ويژگيهاي خاص خود را نيز دارا ميباشد. اين روند را ميتوان تا بالاترين Class، يعني وسايل نقليه، ادامه داد.
از ديدگاه OOP، براي هر Class سه نوع Method و Attribute در نظر گرفته ميشود: Public، Protectedو Private كه تفاوت اينها در Inheritance نمايان ميشود.
هر Method يا Attribute كه در يك Class به صورت Public تعريف شود، توسط همه Objectهاي Classهاي ديگر قابل دسترسي ميباشد.
هر Method يا Attribute كه در يك Class به صورت Protected تعريف شود، فقط توسطObjectهاي Classهايي كه از اين Class به ارث بردهاند، قابل دسترسي ميباشد.
هر Method يا Attribute كه در يك Class به صورت Private تعريف شود، توسط هيچ Objectاي جز Objectهاي همان Class قابل دسترسي نميباشد.
هر کلاس از کلاسهاي بالاتر خود در اين سلسله مراتب ارث مي برد و به کلاس پايين تر از خود ارث مي دهد . هر زير کلاس تمام متدها و متغيرهاي فوق کلاس خود را به ارث مي برد و ديگر نيازي به تعريف مجدد آنها وجود ندارد .
بالاترين کلاس در سلسله مراتب کلاس هاي جاوا کلاس Object است و تمام کلاسهاي ديگر از اين کلاس مشتق مي شوند . اين کلاس تعيين کننده کلي ترين متدها و خواص تمام کلاس هاي ذيل خود است . معمولاً کلاس ها ضمن ارث بردن از کلاسهاي بالاتر از خود ، چيزهايي را به آن اضافه و پياده سازي مي کنند .
پاسخ : تفاوتها و شباهتهای c++,java
ايجاد سلسله مراتب کلاس
وقتي تعداد کلاس ها زياد است ، منطقي است که آنها را در يک سلسله مراتب گرد آوريم تا بتوانيم نحوه به ارث رسيدن متدها و خواص را بهتر کنترل کنيم . بدين ترتيب نياز به دوباره نويسي کدها به حداقل رسيده و هنگام نياز به تغيير کدها نيز اصلاحات فقط در يک نقطه انجام خواهد شد و از آنجا به تمام نقاط ديگر دسترسي خواهند يافت .
اجازه دهيد با استفاده از مثال Motorcycle موضوع را روشنتر کنيم . ديديد که کلاس Motorcycle چگونه طراحي شد ( و بخوبي کار کرد ). حال فرض کنيد بخواهيم کلاس جديدي بنام Car ( اتومبيل ) بسازيم . موتور سيکلت و اتومبيل شباهتهاي زيادي با هم دارند . در نظر اول بنظر مي رسد که بهتر است کلاس Motorcycle را باز کنيم و اطلاعات درون آن را به داخل کلاس جديدي بنام Car کپي کنيم . اما ايده بهتري هم وجود دارد و آن انتقال اطلاعات مشترک اين دو کلاس به يک کلاس کلي تر است . با اينکه اين روش کار بيشتري مي طلبد ولي توسعه آن و ايجاد کلاسهاي جديدتر ( مانند دوچرخه ، کاميون و غيره ) را ساده تر خواهد کرد .
اجازه دهيد با شروع از بالاترين کلاس جاوا در سلسله مراتب کلاس ها ، يعني کلاس Object ، يک سلسله مراتب جديد بسازيم . کلي ترين کلاسي که مي تواند اين دو وسيله نقليه را در خود جاي دهد را کلاس Vehicle مي ناميم . يک وسيله نقليه (Vehicle) چيزي است که مي تواند فردي را از نقطه اي به نقطه ديگر منتقل کند . در کلاس Vehicle فقط رفتار انتقال از نقطه a به نقطه b را تعريف خواهيم کرد و نه هيچ چيز بيشتر .
در ذيل کلاس Vehicle چه چيزي بايد قرار دهيم ؟ مثلاً ماشين متحرک با نيروي انساني و ماشين متحرک با موتور چطور است ؟ ماشين متحرک با نيروي انسان مثلاً مي تواند پدال داشته باشد ( و يا هر مکانيزمي براي انتقال حرکت انسان به ماشين ). ماشين متحرک با موتور هم ( به احتمال زياد! ) يک موتور دارد ، به سوخت نياز دارد و به وسيله اي براي تنظيم سرعت . در ذيل کلاس Engine Powered Vehicle مي توانيم چند کلاس مثل Car ، Motorcycle و Truck قرار دهيم . ولي مي توانيم با ايجاد يک کلاس بينايي باز هم رفتارها را تقسيم بندي کنيم .
بالاخره کلاس Motorcycle را در ذيل کلاس Two Wheeled ( دو چرخ ) قرار داده ايم . اما شايد بپرسيد که خواصي مثل رنگ و نوع را کجا بايد قرار داد ؟ مي توان اين خواص را در کلاس Vehicle قرار داد تا تمام زير کلاسها آنها را به ارث ببرند . تنها چيزي که بايد به خاطر داشته باشيد اين است که وقتي يک حالت ( خاصيت ) يا رفتار را تعريف کرديد ، ديگر به طور خودکار در سلسله مراتب به تمام زير کلاسها انتقال خواهد يافت ( به ارث خواهد رسيد ).
Data چند ريختي(Poly-Morphism)
ديديم كه Classهاي مختلف ميتوانند رفتارها و خصوصياتي را از يكديگر (Super Classes) به ارث ببرند. با توجه به اين مفهوم، بايد در مورد مفهوم ديگري به نام Poly-morphism نيز صحبت كنيم.
عبارت است از چند شکل مختلف از يک عمل يا يک مفهوم يا تابع در سطوح مختلف ارث بري که در اثر Overrde ايجاد مي شود و در کلاس پايه حتما بايد يک کلاس Virtual داشته باشيم.
دو نوع Polymorphism داريم :
چند شکلي در زمان کامپايل - استفاده از Type Casting
چند شکلي در زمان اجرا
يك هواپيما و يك كشتي هر دو وسيله نقليه به شمار ميآيند. يكي از رفتارهايي كه هر وسيله نقليه دارد، حركت كردن است. پس ما در ClassVehicle يك Method خواهم داشت كه اين رفتار را تعريف خواهد كرد. سوالي كه مطرح است، اين است كه آيا همه وسايل نقليه يك جور حركت ميكنند؟ آيا ميتوانيم اين نحوه حركت را در Vehicle Class تعريف كنيم و توقع داشته باشيم همه Sub Classهاي آن همان رفتار را به ارث ببرند و اصطلاحاً همه يك جور حركت كنند؟ مسلماً پاسخ هر دو سوال منفي خواهد بود، زيرا هرگز نميتوان پذيرفت كه هواپيما و كشتي يك جور حركت كنند. پس چه بايد كرد.
ما رفتار حركت كردن را در Vehicle Class به گونهاي تعريف ميكنيم كه صرفاً نشان دهيم همه Sub Classهاي آن اين رفتار را دارند ولي خودشان بايد چگونگي بروز آن رفتار را تعريف كنند. به يك چنين رفتاري در Vehicle Class اصطلاحاً Virtual Method گفته ميشود. به اين ترتيب مشاهده ميكنيم كه همه Sub Classها چنين رفتاري دارند، ولي "ريخت" انجام آن تفاوت دارد.
پاسخ : تفاوتها و شباهتهای c++,java
انواع سطوح زبان ها:
زبانها به سه دسته کلي تقسيم ميگردند :
1- زبان ماشين (سطح پايين) : اين زبان مستقيما با صفر و يک نوشته مي شود و بدون هيچ واسطه اي برروي کامپيوتر قابل اجرا است. طراحان سخت افزار هر کامپيوتر، زبان ماشين خاص خود را براي آن ماشين طراحي مي نمايند. به همين دليل هر برنامه اي که به زبان ماشين نوشته شود، فقط برروي همان ماشين خاص کار مي کند، بهمين دليل برنامه هاي نوشته شده به زبان ماشين را غير قابل حمل مي نامند. از طرف ديگر يادگيري اين زبان بسيار مشکل بوده و برنامه نويسي با آن نيز بسيار سخت است و همچنين احتمال بروز خطا نيز در آن زياد است.
2- زبان اسمبلي : اين زبان شکل ساده تر زبان ماشين است، بدين صورت که براي هر دستورالعمل زبان ماشين، يک اسم نمادين انتخاب شده است (مانند دستور ADD بجاي کد دودويي دستورالعمل جمع) که بخاطر سپردن و برنامه نويسي با آنها براي انسانها ساده تر است. اما اين برنامه ها براي ماشين قابل فهم نيست و بايد قبل از اجرا شدن توسط برنامه مترجمي بنام اسمبلر به زبان ماشين تبديل شود. توجه کنيد که از آنجا که هر دستور زبان اسمبلي معادل يک دستور زبان ماشين است، اين زبان نيز وابسته به ماشين مي باشد و برنامه هاي نوشته شده به اين زبان فقط برروي همان کامپيوتري که براي آن نوشته شده اند قابل اجرا است. علاوه براين کار با اين زبانها هنوز هم نسبتا مشکل بود و فقط متخصصين کامپيوتر قادر به استفاده از آنها بودند.
3- زبانهاي سطح بالا : دستورالعملهاي اين زبانها بسيار نزديک به زبان انسانها (بطور مشخص زبان انگليسي) مي باشد و بهمين دليل برنامه نويسي به آنها بسيار ساده تر بوده و مي توان الگوريتمها را به راحتي به اين زبانها تبديل کرد. از آنجا که اين زبانها به هيچ ماشين خاصي وابسته نيستند، برنامه هاي نوشته شده با اين زبانها (تا حد زيادي) قابل حمل مي باشند. مثالهايي از اين زبانها عبارتند از :
- بيسيک (Basic): براي کاربردهاي آموزشي
- فرترن (Fortran) : براي کاربردهاي علمي و مهندسي
- پاسکال (Pascal) : براي کاربردهاي آموزشي و علمي
برنامه هاي نوشته شده به اين زبانها ابتدا بايد به زبان ماشين ترجمه شوند تا برروي کامپيوتر قابل اجرا باشند. براي ترجمه اين زبانها از کامپايلرها و يا مفسرها استفاده مي شود.
معرفي سيپلاسپلاس
زبان برنامهنويسي ++C (تلفظ مي شود: سي پلاس پلاس) يک زبان برنامهنويسي کامپيوتري سطح بالا و عمومي (با کاربرد هاي متنوع) مي باشد. اين زبان از تمام روش هاي مرسوم برنامه نويسي از قبيل برنامهنويسي شيگرا، برنامه نويسي ساخت يافته و برنامه نويسي پايه پشتيباني مي کند.
زبان ++C در سال ۱۹۸۳ در آزمايشگاه هاي بل (Bell Labs) و بر مبناي زبان سي با افزودن امکانات برنامه نويسي شي گرا ساخته شد. اين زبان از حوالي سال ۱۹۹۰ ميلادي يکي از پرکاربردترين زبانهاي برنامه نويسي به شمار مي رود که براي برنامه نويسي سيستمي و برنامه نويسي ويژوال (بر مبناي GUI) در محيط هاي مختلف از قبيل ويندوز و لينوکس به صورت وسيع به کار مي رود.
پاسخ : تفاوتها و شباهتهای c++,java
ساختار برنامه ها
ساختار برنامه ها در اين زبان بدين صورت است که همانند زبان سي، هر برنامه بايستي يک تابع اصلي (main) به عنوان بدنه برنامه داشته باشد. هر برنامه معمولا از تعداد زيادي فايل تشکيل مي شود که به هم الحاق مي گردند (با دستور include) و به اين فايل هاي الحاقي سرآيند (Header) ميگوييم. فايل هاي الحاقي حاوي کد ها يا نسخه هاي اجرايي کلاس ها (مجموعه متغير ها و توابع) مي باشند که در بدنه اصلي برنامه از آنها استفاده مي شود. معمولاً هر کلاس (که تعريف يک نوع داده اي با متد هاي مربوط به آن است) را در يک سرآيند مينويسند. هر سرآيند که معمولا تنها تعاريف (معرفي) کلاس را در خود دارد به همراه فايل هاي پياده سازي به زبان ++C يا پياده سازي هاي کامپايل شده (به صورت فايل اشيا مانند dll يا so يا ... ) مي تواند به کار برده شود. به مجموعه هاي يکپارچه اي از کلاس هاي پياده سازي شده (به صورت فايل هاي سرآيند با پياده سازي هاي کد يا اشياي زبان ماشين) که براي برنامه نويسي به کار مي روند، يک کتابخانه ++C گفته مي شود و قدرت اصلي اين زبان در امکان به کارگيري کتابخانه هاي آماده مي باشد. کتابخانه هاي بزرگ ++C مانند STL، MFC، QT و ... مجموعه قدرتمندي براي توليد برنامه در اين زبان ايجاد کرده اند.
يك برنامه نمونه
در اين قسمت براي آشنايي اوليه با زبان C++ يك برنامه نمونه آورده شده است كه بدون هيچ تغييري در محيط BorlandCPP قابل اجرا است.
// This Program Computes the Area of a Circle
#include <stdio.h>
void main() {
int radius ;
float area;
cout<<"please enter radius : ";
cin>>radius;
area = 2 * 3.14 * radius;
cout<<"Area is "<<area;
}
please enter radius : 10
Area is 62.8
درمورد برنامه فوق به نکات زير توجه کنيد :
- خط اول يک توضيح درمورد برنامه است. در زبان C++ براي توضيحات يک خطي از علامت // استفاده مي گردد. اما چنانچه توضيحات بيش از يک خط بود،- آن را با علامت /* شروع کرده و با */ پايان دهيد. کامپايلر از اين توضيحات صرفنظر خواهد کرد. اين توضيحات باعث مي شوند که برنامه شما خواناتر شده و ديگران بهتر آن را درک کنند.
پاسخ : تفاوتها و شباهتهای c++,java
- هر دستوري که با علامت # شروع شود،- يک دستورC++ نيست،- بلکه جزودستورات پيش پردازنده محسوب مي گردد. دستورات پيش پردازنده،- دستوراتي هستند کهتوسط کامپايلر قبل از شروع به کامپايل انجام مي شوند. بعنوان مثال دستور #include باعث مي شود که تعاريف اوليه مربوط به توابعي (زيربرنامه هايي) که قصد استفاده ازآنها را داريم به برنامه اضافه شود. در مثال بالا براي استفاده از توابع Cout و Cin که در کتابخانه استاندارد C تعريف شده اند،- فايل سرآمد stdio.h را که اينتوابع در آن تعريف شده اند را استفاده کرده ايم.
- هر برنامه C بايد داراي تابعي به نام main باشد که اجراي برنامه ازآن شروع مي شود و در حقيقت همان برنامه اصلي است. البته مي توان هر تعداد ديگريتابع (زيربرنامه) نيز تعريف کرد،- اما وجود تابع main الزامي است. دقت کنيد که گرچهاين تابع پارامتر ورودي ندارد،- اما از پرانتز باز و بسته تنها استفاده شدهاست.
- در زبان++C هر بلوک برنامه با علامت { آغاز شده و با } پايان مييابد. اين دو معادل دستورات begin و end در زبانهاي ديگر ازجمله پاسکال مي باشند کهبراي سادگي زبان انتخاب شده اند.
- دو خط بعدي به تعريف متغيرهاي radius و area مي پردازد. در زبان++ Cقبل از استفاده از هر متغيري بايد آن را اعلان نماييد. اعلان متغير شامل نام و نوعمتغير است. در مثال فوق،- متغير radius از نوع عدد صحيح (integer) و متغير area ازنوع عدد اعشاري (float) تعريف شده اند.
- توابع Cout و Cin جزو کتابخانه استاندارد++ Cمحسوب مي گردند وبه ترتيب براي چاپ اطلاعات در خروجي استاندارد (نمايشگر) و دريافت اطلاعات از ورودياستاندارد (صفحه کليد) استفاده مي شوند. براي چاپ رشته مورد نظر بايد آنها را درداخل علامت " قرار داد.
- دقت کنيد که در پايان هر دستورالعمل از علامت ; استفاده شده است. در مجموع++ Cيک زبان قالب آزاد است و شما مي توانيد دستورات را به هر نحوي که دوستداريد قرار دهيد (مثلا چند دستور در يک خط از برنامه). تنها چيزي که نشاندهندهپايان يک دستور است،- علامت ; است(و نه انتهاي خط).
پاسخ : تفاوتها و شباهتهای c++,java
چگونه می توان از وقف ها در زبان C++ استفاده کرد ؟
خوب بد نیست اینجا کمی هم درباره وقفه ها صحبت کنیم . وقفه ها سیگنال هایی هستند که از برنامه های در حال اجرا و یا دستگاه های جانبی کامپیوتر (چاپگر و مونیتور و موس و . . .) در خواست می شود , وقتی وقفه ای اتفاق می افتد اجرای برنامه به تعویق افتاده محتویات ثباتهای CS و IP در پشته نگهداری شده و کنترل روال پاسخگو یی به این وقفه منتقل می شود . پس از پاسخگو یی به وقفه مورد نظر محتویات CS و IP از پشته ها بازیابی می شود. تعداد 256 وقفه وجود دارد که هر یک دارای زیر برنامه و توابع مخصوص به خود می باشند که می تواند اعمال مختلفی را انجام دهند . لیست وقفه ها را می توانید در مراجع اصلی زبان اسمبلی و با جستجو در اینترنت پیدا کنید .
خوب در زبان C/C++ برای اجرای وقفه ها ابتدا ثباتهای مورد نیاز مقدار دهی شده و با استفاده از تابع زیر اجرا می شود
int ( int intnum , union REGS *in , union REGS *out )
union : یونیونها یک قالب داده می باشد که می تواند انواع مختلفی از داده ها را در خود نگهداری کند و فقط یک نوع داده را می تواند در یک زمان نگهداری کند و این همان تفاوت union با struct ها می باشد , struct ها می تواند در یک زمان چند نوع داده مختلف را نگهداری کند (int , long , double , char)
پاسخ : تفاوتها و شباهتهای c++,java
معرفی چند تابع برای تبدیل انواع داده ها :
نام تابع
شرح وظیفه
atof
برای تبدیل یک رشته به عدد اعشاری
Atoi
تبدیل رشته به عددی از نوع Integer
Atol
تبدیل رشته به عددی از نوع Long
ecvt and fcvt
تبدیل عدد اعشاری به رشته
gcvt
تبدیل عدد اعشاری به رشته
strtod
تبدیل رشته به عدد اعشاری از نوع Double
strtol
تبدیل رشته به عددی از نوع Long
_strtold
تبدیل رشته به long double
نکاتی در مورد توابع
. clreol : این تابع تمام کاراکترها که بعد از مکان نما قرار دارد را تا آخر آن خط پاک میکند بدون آنکه موقعیت مکان نما تغییر کند . علت اینکه من از تابع cptintf در مثال زیر استفاده کردم این است که توابع clreol - clrscr و getch هر سه در کتابخانه Conio.H هستند و تابع cprintf هم در این کتابخانه است و دیگر از printf استفاده نکردم همچنین یکی دیگر از مزیت های cprintf این است که برای چاپ text های رنگی در خروجی از این تابع استفاده می شود , در حالیکه printf چنین امکانی را در اختیارمان قرار نمی دهد .
2 . delline : این تابع سبب می شود که خطی که مکان نما (Cursor) در آن قرار دارد حذف شود .
3 . insline : با استفاده از این تابع می توان یک خط خالی در بالای مکانی که مکان نما قرار دارد
textmode : این تابع نوع نمایش text در صفحه نمایش را کنترل می کند .