PDA

نسخه کامل مشاهده نسخه کامل : چرا در Overloading ؟



Life24
20-11-2013, 09:06
سلام

دوستان هنگام سربارگذاری عملگر ها چرا ما وقتی میخواهیم ">" را پیاده سازی کنیم،همزمان باید "<" را هم پیاده سازی کنیم؟!
یعنی میگن بزرگ تر وقتی معنا پیدا میکنه که کوچک تر وجود داشته باشه. اما من نمیفهمم :n27:

Msba
25-11-2013, 21:34
چرا مسئله می پیچد:n27:؟؟؟
یک سوال)
من بزرگترم یا شما؟
من کوچکترم یا شما؟
باید هر کدام را می پرسند پاسخی داشته باشید. چرا؟ چون ممکن است یکی دومی را بپرسد و یکی اولی، کامپایلر نیز همین را از شما می خواهد و اگر پاسخ را نداند می رود در آمپاس (اونم نه آمپاس؛ آممممپاس، ان قلت هم ندارد :n02: )
به طور مثال وقتی عمل بزرگتر تعریف می شود شما شی تان را حساس به این کرده اید که ممکن است از یک شی دیگر از نوع خودش بزرگتر باشد، به صفت "تر" دقت کنید یعنی نسبت به چیز دیگر که آن چیز دیگر ممکن است کوچک باشد. کوچک؟ کوچک نسبت به چی؟ پس نیاز به تعریف کوچکتر نیز هستیم.
اگر این مبحث را ادامه دهید به احتمال زیاد به منطق فازی نیز می رسید!
یک مورد که فکر کنم برایتان جالب باشد و آن هم بحث بهینه سازی توسط کامپایلر هست. بگوییم:
آیا من بزرگتر هستم؟
من کوچکتر نیستما؟
هر دو یک معنی را می دهند با با یک شرط نقیض. یعنی ممکن است کامپایلر برای بهینه سازی بخواهد بجای عمل کوچکتر از عمل بزرگتر استفاده کند و بخش else را فراخوانی کند. (بحث ماکرو سازی در Assembler) حالا اگر اون یکی نباشد می رود کجا؟
.
.
.
.
احسنت: آمپاس! :n02:


موفق باشید.

Life24
27-11-2013, 16:58
سلام
دوست عزیز:
ممنون از پاسخ شما
فهمیدم اما قانع نشدم. :n27:

Msba
28-11-2013, 00:17
1- یعنی ممکن است کامپایلر برای بهینه سازی بخواهد بجای عمل کوچکتر از عمل بزرگتر استفاده کند و بخش else را فراخوانی کند.

2-
چون ممکن است یکی دومی را بپرسد و یکی اولی، کامپایلر نیز همین را از شما می خواهد.

این شما را قانع نمی کند؟ اگر این امکان شما را قانع نمی کند پس بریم سراغ حرف زور [مزاح]: قانونه همینی که هست! (یه چیز تو مایه های پول زور! :n02:)
3- این را هم در نظر بگیرید که ممکن است در جایی کامپایلر گزاره ی شما را در Assembler از آن طرف پیاده سازی کند.

موفق باشید.

Life24
28-11-2013, 10:49
این شما را قانع نمی کند؟ اگر این امکان شما را قانع نمی کند پس بریم سراغ حرف زور [مزاح]: قانونه همینی که هست! (یه چیز تو مایه های پول زور! :n02:)
3- این را هم در نظر بگیرید که ممکن است در جایی کامپایلر گزاره ی شما را در Assembler از آن طرف پیاده سازی کند.

موفق باشید.

سلام
راستش رو بخواهید اصلا من جریان رو نگرفتم! :weird:
من الان یک قطعه کد رو نوشتم و == رو اورلود کردم و برای != اومدم دقیقا مثل == کد نوشتم و جای true و false رو تغیر دادم!!

یعنی قانون هست که هر وفت + رو آورلود کردیم با - هم آورلود بشه؟
اگر * آورلود کردیم باید / هم آورلود بشه؟
اگر == باید != هم آورلود بشه؟
اما یک مثالی در ماکروسافت دیدم خودش اینکار را نکرده!!
در مثال اینجا فقط + رو نوشته و - هم ننوشته . و داره جواب میگیره
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
:n27: :n28:

Msba
28-11-2013, 11:57
تمام عملگر ها در این شرایط قرار نمی گیرند. دقت کنید می بینید operator های منطقی نیازمند دو حالت هستند یعنی هم خودشان هم عکس شان. این هم به خاطر امکان هایی است که در بالا گفتم (ممکن است امکان های دیگری نیز باشد.) اما در عملگر های محاسباتی وقتی می گویید جمع مطمئنا باید جمع صورت بگیرد و کامپایلر نمی تواند جای آن کسر بگذارد و یا به جای ضرب از تقسیم استفاده کند چرا که در محاسبات پیچیده این رفتار ها می تواند نتیجه ی محاسبات را تغییر دهد و کامپایلر در صورت تغییر نمی تواند این موضوع را بفهمد و اصلاح انجام دهد.
عملگر های منطقی مثلا: ==,=!, <,> و با مساوی بودن آن ها.
محاسباتی مثلا: >>, <<, +,-,*,/

موفق باشید.