تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 7 از 10 اولاول ... 345678910 آخرآخر
نمايش نتايج 61 به 70 از 96

نام تاپيک: آموزش ++C

  1. #61
    حـــــرفـه ای sin2x=2sinxcosx's Avatar
    تاريخ عضويت
    Dec 2007
    پست ها
    2,234

    پيش فرض

    باز هم سلام .
    اين دوستمون dogtag يه خورده از دستم ناراحت بودن که ... .
    براي همين يه پست ديگه هم ميدم در مورد چطوري سربارگذاري کنيم .
    خوب براي سربارگذاري هر عملگر يه تابع مي نويسيم . اسم اين تابع هميشه بايد از کلمه کليدي operator به اضافه عملگر مورد نظر تشکيل بشه . تنها نکته اي که مي مونه اينه که اين تابع چي بايد برگردونه و چي بايد بگيره . اين هم که تقريبا راحته . شما يه بار عملگر رو تو ذهن خودتون مجسم کنين و ببينين وقتي کاربر تو جايي مي نويسه h1 == h2 ، که h1 و h2 اشيائي از کلاس شما هستن ، مي خواد که نتيجه يا True ‌باشه يا False . يعني تابع سربارگذاري ما نبايد چيزي غير از اين برگردونه . بنابراين ما مي تونيم از نوع داده اي bool که فقط مي تونه true و يا false رو تو خودش نگه داره به عنوان نوع داده برگشتي تابع سربارگذاري عملگر == استفاده کنيم . بعد تو پياده سازي هم معين کنيم که کي true برگردونده بشه و کي false . اين عملگر به دو تا عملوند نياز داره . يکيش که همون خود شيئي است که اين تابع رو فراخواني کرده ، يعني this و يکيشو هم از طريق آرگومان براش مي فرستيم . در مورد عملگر =! به همين طور . ولي يه چيزي . شما وقتي == رو سربارگذاري کردين ، ديگه لازم نيست =! رو هم دوباره سربارگذاري کنين . مي تونين تو پياده سازي =! راحت بنويسين :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    يعني هر چي عملگر == برگردوند ، =! خلاف اون رو برگردونه . ( ! علامت نقيض تو ++C هست . )
    از اين کارا تو سربارگذاري عملگرهاي < و > و => و =< هم استفاده کنين .
    مثلا فرض کنين عملگر > رو سربارگذاري کردين . اين تابع هم نتيجه اش يا true هست يا false . بنابراين براي نوع داده برگشتي اين تابع از bool استفاده ميکنيم . مثل == هم يه آرگومان ميگيره از نوع شيئي از خود کلاس . اين تابع رو پياده سازي مي کنيم . حالا سه عملگر بعدي به صورت زير به سادگي قابل سربارگذاري هستن :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    حالا کاربر فرض کنين تو تابع main دو تا شيء به نام هاي h1 و h2 از کلاسمون گرفته و داره کاراي زير رو انجام ميده :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    تو اولي ميگيم آيا h1 کمتر از h2 هست ؟ تو اين جا انگار h1 داره تابع > رو فراخواني ميکنه . پس this همون h1 هست . يعني تو عملگرهاي دودويي ، هميشه عملگر سمت چپ به جاي this قرار مي گيره .
    تابع سربارگذاري > فراخواني ميشه و بر اساس پياده سازيش يکي از دو مقدار true يا false رو برمي گردونه . فرض کنين true برگردونده شده . يعني h1 کوچکتر از h2 هست . حالا ميره خط 2 و مي گه آيا h1 يا this بزرگتر از h2 هست ؟ سربارگذاري عملگر بزرگتر به ما ميگه که اين تابع نتيجه تابع h2 < *this رو برميگردونه . که اين تابع false بر ميگردونه . چون h2 بزرگتر از this يا h1 بود . در مورد h1<= h2 هم تابع سربارگذاري اين عملگر ، نقيض عملگر < رو برميگردونه . يعني اگه بزرگتر نباشه پس حتما کوچکتر يا مساوي هست و به همين ترتيب ... .

    مثلا فرض کنين مي خواين عملگر = رو سربارگذاري کنين . اين عملگر بايد شيء سمت راست خودش رو تو شيء سمت چپ يا this کپي کنه . پس يه شيء از خود کلاس ميگيره و يه شيء از خود کلاس برمي گردونه .
    ضمنا يه نکته :
    از عملگر = ميشه بدون سربارگذاري براي هر شيئي از کلاس هامون استفاده کرد . اين عملگر به طور اتوماتيک تک تک داده هاي عضو کلاس مون رو کپي مي کنه . اين کار در بيشتر مواقع کار مدنظر ماست . ولي اين کار تو بعضي جاها خيلي خطرناکه . مثلا جايي که شما يه داده عضو اشاره گر داشته باشين . مي دونين که اشاره گر حاوي آدرس يه متغير هست . بنابراين موقع کپي شدن آدرس کپي ميشه و اين مي تونه بعدا مشکلاتي جدي بوجود بياره . ( چون دو تا متغير داراي يه آدرس تو حافظه ميشن . )


    در مورد istream و ostream‌ سوال پرسيدين که من قبلا در موردشون بحث کرده بودم . istream يه کلاسه که تو کتابخانه استاندارد ++C تعريف شده و عمليات ورودي از صفحه کليد رو کنترل مي کنه و ما مي تونيم ازش استفاده کنيم . ostream هم يه کلاسه که تو کتابخانه استاندارد ++C تعريف شده و عمليات خروجي رو کنترل مي کنه و ما مي تونيم ازش استفاده کنيم . وقتي مي خوايم عملگرهاي ورودي و خروجي ( << و >> ) رو سربارگذاري کنيم ، اين توابع بايد يه istream يا ostream برگردونن .


    ديگه نمي دونم باز هم مطالب گنگ هستن يا نه . ولي اگه گنگه باز هم بگين . من در خدمت هستم .

  2. 3 کاربر از sin2x=2sinxcosx بخاطر این مطلب مفید تشکر کرده اند


  3. #62
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    پيش فرض

    این دفعه خـــیــــلــــی عالی گفتید.
    واقعاً مرسی.

    فقط اگر دلتون خواست، اون >> و << رو هم که قبلاً گفته بودید، با همین بیان، مطرح کنید.
    (البته فکر کنم با این توضیحات، الان اونها رو بخونم، 100% بفهمم)

    دوباره ممنون

  4. این کاربر از dogtag بخاطر این مطلب مفید تشکر کرده است


  5. #63
    حـــــرفـه ای sin2x=2sinxcosx's Avatar
    تاريخ عضويت
    Dec 2007
    پست ها
    2,234

    پيش فرض

    ممنون دوست عزيز .
    در مورد << و >> ؟
    باشه . هميشه حق با مشتريه . ميگم . با اينکه قبلا يه پست بهش اختصاص داده بودم .
    iostream يه کتابخانه است . اون رو include مي کنيم تا بتونيم از قابليت ها ورودي و خروجي که با سخت افزار درگير هستن به راحتي استفاده کنيم . کتابخانه مجموعه اي از کلاس هاي از پيش تعريف شده هست .
    istream و ostream هر کدوم يه کلاس از اين کتابخانه هستن .
    cout و cin دو تا شيء به ترتيب از کلاس هاي ostream و istream هستن که اين شيءها هم از قبل تعريف شده هستن .
    ما مي خوايم عملگرهاي << و >> براي کلاسمون سربارگذاري کنيم . مجبوريم از اين کلاس هاي istream و ostream استفاده کنيم تا بتونيم يه چيزي رو از صفحه کليد بگيريم و يا يه چيزي رو تو صفحه نمايش چاپ کنيم . ما وقتي مي نويسيم cout << h1 ، شيء cout تابع سربارگذاري ما رو احضار مي کنه . ولي cout که شيئي از کلاس ما ( HugeInt ) نيست که ! يه شيء از کلاس ostream هست . پس this اينجا وجود نداره . بنابراين ما تابع سربارگذاري اين تابع رو داخل کلاس نمي ذاريم . يعني تابع سربارگذاري عملگر خروجي يه تابع عضو نيست . يه تابع سراسري يا Global هست که خارج از کلاس تعريف ميشه . ولي ما چرا داخل کلاس استفاده کرديم ؟ براي اينکه به کلاس نشون بديم اين تابع دوست ما هست و مي تونه به داده هاي private ما دسترسي داشته باشه . و اعلان friend رو در اولشون آورديم . اين عملگرهاي << و >> هم يه عملگر دودويي هستن . قبلا وقتي مي خواستيم يه عملگر دودويي مثل + رو سربارگذاري کنيم ، مي گفتيم يکي از عملوندها this يا همون شيئي که اين تابع رو فراخواني کرده و شيء ديگه ( شيء سمت راست ) رو هم براي تابع مي فرستاديم . ولي اينجا ما this نداريم . this ما هميشه عملوند سمت چپ مي شد . ولي اينجا که عملگر سمت چپ ما اصلا يه شيء از کلاس ما نيست . عملوند سمت چپ ما cout هست که شيئي از کلاس ostream هست . بنابراين مجبوريم هر دو عملوند رو براي تابع سربارگذاري بفرستيم . مثلا تو کلاس Rational که قبلا مثال زده بودم ، يه شيء به اسم out از کلاس ostream‌ براي تابع سربارگذاري فرستاده بوديم و يه شيء هم از خود کلاسمون . اين تابع يه ostream هم برميگردونه تا داخل cout بذاره و نتيجه چاپ بشه . در مورد istream هم همين طور .

    ولي باز هم اگه مشکلي هست خواهشا بپرسين . تا وقتي شما اجازه ندادين من ارث بري رو شروع نمي کنم .
    از پشتکارتون خوشم مياد . اگه شما و امثال شما نبودن ، روحيه اي براي ادامه در بنده نمي موند .
    ولي اينو هم بدونين که تو هيچ کتابي اين همه به سربارگذاري اين دو عملگر پرداخته نشده .
    معمولا يه مثال زدن گفتن يه istream براش مي فرستيم و يه شيء از کلاس خودمون و تمام . نمونه اش کتاب ديتل که اولين مرجع درس برنامه نويسي پيشرفته براي دانشجويان کشور و البته خارج از کشور .
    موفق باشين ...

  6. این کاربر از sin2x=2sinxcosx بخاطر این مطلب مفید تشکر کرده است


  7. #64
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    پيش فرض

    خیلی ممنون.
    خوب بود.

    اجازه ما دست شماست.
    مشتاقانه منتظر ادامه مطلب هستم.

  8. #65
    حـــــرفـه ای sin2x=2sinxcosx's Avatar
    تاريخ عضويت
    Dec 2007
    پست ها
    2,234

    پيش فرض

    آقا يه نکته ديگه در مورد سربارگذاري .
    فرض کنين h يه شيء از کلاس HugeInt هست . مي نويسيم cout << h ، در واقع کار فراخواني تابع >>operator رو به صورت زير انجام ميديم :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    ولي وقتي مثلا ميگيم h1 + h2 که h1 و h2 دو شيء از کلاس HugeInt هستن ، در واقع اين فراخواني انجام ميشه :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

  9. 2 کاربر از sin2x=2sinxcosx بخاطر این مطلب مفید تشکر کرده اند


  10. #66
    حـــــرفـه ای sin2x=2sinxcosx's Avatar
    تاريخ عضويت
    Dec 2007
    پست ها
    2,234

    پيش فرض

    سلام ...

    ارث بري !!

    تقريبا ميشه گفت مهمترين مبحث تکنولوژي شيء گرايي ، مبحث ارث بري هست . البته به نظر من ساده ترين هم هست . ( اگه خودتون مقايسه کنين مي بينين واقعا به نسبت خيلي ساده اس . )
    بدون حاشيه شروع مي کنيم .
    ضمنا من اين پست رو به تئوري اختصاص مي دم . بعدا نگين مثال چرا نگفتي . مثال بعدا مي زنم .
    تعريف جامع و زيباي پروفسور ديتل رو از ارث بري اول ببينين :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    اگه به کلمه کلمه اين تعريف دقت کنين واقعا توضيحات ارث بري تموم شد . فقط مي مونه اين که يه کم Syntax ياد بگيرين .
    ارث بري نوعي استفاده مجدد از نرم افزار ( Source نرم افزار ) هست که برنامه نويس داده ها و رفتارهاي ( Attributes & Behavior ) کلاس موجود را در اختيار مي گيرد و به آن قابليت هاي جديدي مي افزايد .
    اين هم ترجمه طلبه sin2x=2sinxcosx از جمله پروفسور ديتل بود .

    فرض کنين يه کلاس داريم که وسيله نقليه رو شبيه سازي کرده و داده ها و توابع عضو اون رو تعريف کرديم .
    اين وسيله نقليه ما چهار عدد چرخ داره . يدونه فرمان داره . دنده داره . يه رنگ داره . هر کدوم براي اين وسيله نقليه يه خصيصه يا Attribute هستن . ( يه داده عضو )
    اين وسيله نقليه مي تونه حرکت کنه و بايسته و يا دور يزنه . هر کدوم براش يه رفتار يا Behavior هستن . ( يه تابع عضو )
    بعد فرض کنين يه اتومبيل هم داريم به اسم fghijkl . فرض کنين اين اتومبيل هم چهار چرخ داره . فرمان و دنده داره . رنگ هم داره . فرض کنين اين اتومبيل در حالت خاص تر يه چرخ هم زير ماشين اون وسط داره که اتومبيل مي تونه روي اون چرخ بلند بشه و فقط به کمک اين چرخ حرکت کنه . اين اتومبيل هم مي تونه حرکت کنه و بايسته و دور بزنه .
    مي بينين که اتومبيل fghijkl همه خصوصيات و رفتارهاي يک وسيله نقليه رو داره به اضافه يه خصوصيت جديد و يک رفتار جديد . يه چرخ اضافي و رفتار جديد هم اينکه مي تونه روي يه چرخ بايسته .
    ما کلاس وسيله نقليه رو شبيه سازي کرديم و داده هاي عضوش رو مشخص کرديم و توابع عضوش رو هم به طور کامل پياده سازي کرديم . حالا مي خوايم کلاس fghijkl رو پياده سازي کنيم . آيا بايد دوباره عمليات حرکت کردن و ايستادن و دور زدن و همچنين داده هاي چرخ و فرمان و ... رو براش پياده سازي کنيم ؟
    نخير . با يه ارث بري از کلاس وسيله نقليه مشکل حل خواهد شد .
    در اين حالت مي گيم fghijkl يک وسيله نقليه است . کلاس fghijkl توابع و داده هاي کلاس وسيله نقليه رو به ارث مي بره . حالا مي تونه اون توابع رو با کمي تغيير براي خودش استفاده کنه و يا اگه هم تعريف نکرد دقيقا هموني که تو کلاس وسيله نقليه هست اجرا مي کنه . فقط کافيه يه داده عضو ( همون يه چرخ وسطي ) اضافه بشه + يه رفتار ( ايستادن روي يک چرخ و ... )
    حالا برگردين و جمله ديتل رو يه بار ديگه بخونين .

  11. 5 کاربر از sin2x=2sinxcosx بخاطر این مطلب مفید تشکر کرده اند


  12. #67
    حـــــرفـه ای sin2x=2sinxcosx's Avatar
    تاريخ عضويت
    Dec 2007
    پست ها
    2,234

    پيش فرض

    سلام دوستان عزيز ...
    بنده قراره اگه خدا بخواد فردا برم مسافرت و تا شروع ماه مبارک رمضان در خدمت نيستم . ببخشيد بحث نيمه کاره موند . اگه مي دونستم پنج شنبه مي رم يا ارث بري رو شروع نمي کردم و يا اگه شروع مي کردم تمومش مي کردم و بعد مي رفتم . الان هم ببخشيد متاسفانه اصلا وقت ندارم و دارم مي رم بيرون براي خريد و اينا . فقط يه بار ساعت 12 شب مي تونم بيام . اون موقع اگه خوابم نيومد ميام تمومش مي کنم .
    موفق باشين .........................

  13. #68
    حـــــرفـه ای sin2x=2sinxcosx's Avatar
    تاريخ عضويت
    Dec 2007
    پست ها
    2,234

    پيش فرض

    خوب اومدم که تموم کنم برم .
    قبل از شروع مثال براي ارث بري لازمه که با يه access specifier يا مشخصه دسترسي ديگه آشنا بشين .
    مشخصه دسترسي protected . هر گاه يه داده يا يه تابعي در کلاس پايه به صورت protected تعريف بشه ، تو کلاس هاي مشتق شده ( به ارث رسيده‌) از اون کلاس پايه ميشه به طور مستقيم بهش دسترسي داشت . ولي هر جايي غير از اين جا مثلا تو تابع main نميشه .
    به عضو private تعريف شده در کلاس پايه نميشه از کلاس هاي مشتق يا هر جاي ديگه اي دسترسي داشت .
    به عضو public ميشه هم تو کلاس هاي مشتق و هم تو کلاسها و توابع ديگه دسترسي داشت .
    البته سه نوع ارث بري داريم : public و protected و private . ما فعلا هميشه از ارث بري public استفاده خواهيم کرد . يعني متداول ترين نوع همين public هست .
    اين مثال رو ببينين :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    هدر کلاس Account رو ببينين . يه سازنده داره و سه تا تابع عضو و يه داده عضو .
    بعد اونو تو قطعه کد دوم پياده سازي کرديم .
    تو قطعه کد سوم هدر کلاس SavingsAccount رو مي بينين که از کلاس پايه Account به ارث رسيده ( مشتق شده ) . نياز به توضيح نيست . مي بينين که بعد از تعريف کلاس علامت دو نقطه گذاشتيم و گفتيم که از کلاس Account به طور public مشتق شده . و مي بينين که کلاس پايه ( Base Class ) رو هم تو کلاس مشتق ( Derived Class ) توسط دستور include اورديم . اين کلاس سه تابع عضو کلاس Account و يه داده عضو اونو به ارث برده به اضافه يه تابع عضو و يک داده عضو که خودش اضافي داره .
    يه نکته اي هم که هست اينه که هيچ وقت Constructor به ارث نمي رسه . هميشه بايد براي هر کلاس به طور مجزا تعريفش کنين .
    تو تعريف کلاس مشتق هم مي بينين که تو پياده سازي سازنده ، سازنده کلاس پايه رو هم احضار کرديم .
    يه نکته ديگه . ميشد توابعي که تو کلاس پايه هستن ، تو کلاس مشتق يه طور ديگه پياده سازي کرد . به اين کار ؛ Override کردن تابع ميگن . در اين صورت دو تا تابع همنام خواهيم داشت که دو پياده سازي متفاوت دارن . براي اجراي يک تابع مورد نظر که Override شده ، از نام کلاس به اضافه دو تا دونقطه به اضافه اسم تابع استفاده مي کنيم.
    مثلا فرض کنين ما تابع credit رو تو کلاس مشتق هم پياده سازي کرديم . حالا مي خوايم تابع credit کلاس پايه رو فراخواني کنيم . اين کارو مي کنيم :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    تا اون جايي که من مي دونم تموم شد .
    تا ساعت 12 هستم . اگه موردي هست بگين . اگه نه هم که به خدا مي سپارمتون ...


  14. 3 کاربر از sin2x=2sinxcosx بخاطر این مطلب مفید تشکر کرده اند


  15. #69
    اگه نباشه جاش خالی می مونه
    تاريخ عضويت
    Jan 2009
    پست ها
    242

    پيش فرض

    تفاوت int با long int چیست

  16. #70
    حـــــرفـه ای sin2x=2sinxcosx's Avatar
    تاريخ عضويت
    Dec 2007
    پست ها
    2,234

    پيش فرض

    تو کامپايلرهاي جديد هيچي . يعني همه اينا يکين :
    int و long و long int .
    اگه از عملگر sizeof براي هر کدوم استفاده کنين مي بينين که همشون 4 بايت حافظه مي گيرن .

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •