คำถามติดแท็ก operator-overloading

Operator overloading เป็นคุณลักษณะของภาษาโปรแกรมที่อนุญาตให้ใช้งานแบบกำหนดเองสำหรับตัวดำเนินการขึ้นอยู่กับประเภทของตัวถูกดำเนินการที่เกี่ยวข้อง บางภาษาอนุญาตให้กำหนดโอเปอเรเตอร์ใหม่ในขณะที่ภาษาอื่นอนุญาตให้กำหนดนิยามใหม่ของตัวดำเนินการที่มีอยู่เท่านั้น

7
อะไรคือกฎพื้นฐานและสำนวนสำหรับผู้ให้บริการมากไป?
หมายเหตุ: คำตอบนั้นถูกจัดเรียงตามลำดับที่เฉพาะเจาะจงแต่เนื่องจากผู้ใช้หลายคนเรียงลำดับคำตอบตามการโหวตมากกว่าเวลาที่ได้รับนี่เป็นดัชนีของคำตอบตามลำดับที่พวกเขาเข้าใจมากที่สุด: ไวยากรณ์ทั่วไปของโอเปอร์เรเตอร์ที่บรรทุกเกินพิกัดใน C ++ กฎพื้นฐานสามข้อของผู้ประกอบการมากไปใน C ++ การตัดสินใจระหว่างสมาชิกและไม่ใช่สมาชิก ผู้ประกอบการทั่วไปที่จะเกินพิกัด ผู้ประกอบการที่ได้รับมอบหมาย อินพุตและเอาต์พุตตัวดำเนินการ ผู้ประกอบการโทรฟังก์ชั่น ผู้ประกอบการเปรียบเทียบ ตัวดำเนินการทางคณิตศาสตร์ การห้อยอาร์เรย์ ตัวดำเนินการสำหรับประเภทที่เหมือนตัวชี้ ผู้ประกอบการแปลง การบรรทุกเกินพิกัดใหม่และลบ (หมายเหตุ: นี่คือหมายถึงการเป็นรายการที่จะกองมากเกินของ C ++ คำถามที่พบบ่อย . ถ้าคุณต้องการที่จะวิจารณ์ความคิดของการให้คำถามที่พบบ่อยในรูปแบบนี้แล้วโพสต์บนเมตาที่เริ่มต้นทั้งหมดนี้ . จะเป็นสถานที่ที่จะทำเช่นนั้นได้คำตอบ คำถามนั้นได้รับการตรวจสอบในห้องสนทนา C ++ซึ่งแนวคิด FAQ เริ่มต้นตั้งแต่แรกดังนั้นคำตอบของคุณมีโอกาสมากที่จะได้รับการอ่านโดยผู้ที่คิดแนวคิดนี้)

16
เหตุใด Java จึงไม่ให้ผู้ให้บริการโหลดมากเกินไป
มาจาก C ++ ถึง Java คำถามที่ไม่ได้รับคำตอบที่ชัดเจนคือทำไม Java จึงไม่รวมตัวดำเนินการมากเกินไป? ไม่Complex a, b, c; a = b + c;ง่ายกว่านี้Complex a, b, c; a = b.add(c);หรือ มีเหตุผลที่รู้จักกันในเรื่องนี้ข้อโต้แย้งที่ถูกต้องสำหรับการไม่อนุญาตให้ผู้ประกอบการมากเกินไป? เหตุผลโดยพลการหรือเสียเวลา?

10
พริตตี้คอนเทนเนอร์ C ++ STL แบบสวย
โปรดรับทราบการปรับปรุงในตอนท้ายของโพสต์นี้ อัปเดต: ฉันได้สร้างโครงการสาธารณะบน GitHubสำหรับห้องสมุดนี้แล้ว! ผมอยากจะมีแม่แบบเดียวที่และทุกครั้งจะดูแลสวยพิมพ์ภาชนะ STL operator<<ทั้งหมดผ่าน ในรหัสหลอกฉันกำลังมองหาสิ่งนี้: template<container C, class T, String delim = ", ", String open = "[", String close = "]"> std::ostream & operator<<(std::ostream & o, const C<T> & x) { o << open; // for (typename C::const_iterator i = x.begin(); i != x.end(); i++) /* …

15
== และ! = ขึ้นอยู่กับซึ่งกันและกันหรือไม่
ฉันเรียนรู้เกี่ยวกับการดำเนินงานมากใน C ++ และผมเห็นว่า==และ!=เป็นเพียงบางฟังก์ชั่นพิเศษที่สามารถปรับแต่งสำหรับประเภทที่ผู้ใช้กำหนด แม้ว่าข้อกังวลของฉันคือทำไมต้องมีคำจำกัดความแยกจากกันสองประการ ผมคิดว่าถ้าa == bเป็นจริงแล้วa != bเป็นเท็จโดยอัตโนมัติและในทางกลับกันและไม่มีความเป็นไปได้อื่น ๆ เพราะโดยความหมายคือa != b !(a == b)และฉันไม่สามารถจินตนาการถึงสถานการณ์ที่สิ่งนี้ไม่เป็นความจริง แต่บางทีจินตนาการของฉันมี จำกัด หรือฉันไม่รู้อะไรเลย? ฉันรู้ว่าฉันสามารถกำหนดหนึ่งในแง่ของอื่น ๆ แต่นี่ไม่ใช่สิ่งที่ฉันถามเกี่ยวกับ ฉันยังไม่ได้ถามถึงความแตกต่างระหว่างการเปรียบเทียบวัตถุด้วยมูลค่าหรือเอกลักษณ์ หรือว่าวัตถุสองรายการอาจเท่ากันและไม่เท่ากันในเวลาเดียวกัน (นี่ไม่ใช่ตัวเลือกแน่นอน! สิ่งเหล่านี้เป็นสิ่งที่ไม่เกิดร่วมกัน) สิ่งที่ฉันถามคือ: มีสถานการณ์ใดบ้างที่เป็นไปได้ที่การถามคำถามเกี่ยวกับวัตถุสองชิ้นที่เท่ากันนั้นสมเหตุสมผล แต่การถามเกี่ยวกับวัตถุที่ไม่เท่ากันนั้นไม่สมเหตุสมผล (จากมุมมองของผู้ใช้หรือมุมมองของผู้ใช้) หากไม่มีความเป็นไปได้เช่นนั้นเหตุใด C ++ ในโลกจึงให้ผู้ให้บริการสองรายนี้ถูกกำหนดให้เป็นฟังก์ชั่นที่แตกต่างกันสองรายการ

8
ฉันจะโอเวอร์โหลดตัวดำเนินการตัวยึดสี่เหลี่ยมใน C # ได้อย่างไร
ตัวอย่างเช่น DataGridView ให้คุณทำสิ่งนี้: DataGridView dgv = ...; DataGridViewCell cell = dgv[1,5]; แต่สำหรับชีวิตของฉันฉันไม่พบเอกสารในตัวดำเนินการ index / square-bracket พวกเขาเรียกว่าอะไร มันใช้งานที่ไหน มันโยนได้มั้ย ฉันจะทำสิ่งเดียวกันในชั้นเรียนของตัวเองได้อย่างไร การทางพิเศษแห่งประเทศไทย: ขอบคุณสำหรับคำตอบอย่างรวดเร็วทั้งหมด สั้น ๆ : เอกสารที่เกี่ยวข้องอยู่ภายใต้คุณสมบัติ "รายการ" วิธีในการโอเวอร์โหลดคือการประกาศคุณสมบัติเช่นpublic object this[int x, int y]{ get{...}; set{...} }; ตัวสร้างดัชนีสำหรับ DataGridView ไม่ส่งอย่างน้อยตามเอกสาร ไม่ได้พูดถึงสิ่งที่เกิดขึ้นหากคุณให้พิกัดที่ไม่ถูกต้อง การทางพิเศษแห่งประเทศไทยอีกครั้ง: ตกลงแม้ว่าเอกสารจะไม่พูดถึงมัน (ซุกซน Microsoft!) แต่ปรากฎว่าตัวสร้างดัชนีสำหรับ DataGridView ในความเป็นจริงแล้วจะโยน ArgumentOutOfRangeException เตือนภัย

5
วิธีการโอเวอร์โหลดโอเปอเรเตอร์ << สำหรับ ostream อย่างถูกต้องหรือไม่
ฉันกำลังเขียนไลบรารีเมทริกซ์ขนาดเล็กใน C ++ สำหรับการดำเนินการเมทริกซ์ อย่างไรก็ตามคอมไพเลอร์ของฉันบ่นซึ่งก่อนหน้านั้นไม่ได้ รหัสนี้ถูกวางไว้บนหิ้งเป็นเวลา 6 เดือนและในระหว่างที่ฉันอัพเกรดคอมพิวเตอร์ของฉันจากเดเบียนจำหลักเป็นเลนนี่ (g ++ (เดเบียน 4.3.2-1.1) 4.3.2) แต่ฉันมีปัญหาเดียวกันในระบบ Ubuntu ที่มี g ++ เดียวกัน . นี่คือส่วนที่เกี่ยวข้องของคลาสเมทริกซ์ของฉัน: namespace Math { class Matrix { public: [...] friend std::ostream&amp; operator&lt;&lt; (std::ostream&amp; stream, const Matrix&amp; matrix); } } และ "การใช้งาน": using namespace Math; std::ostream&amp; Matrix::operator &lt;&lt;(std::ostream&amp; stream, const Matrix&amp; …



10
ผู้ประกอบการมากไปใน Java
คุณช่วยบอกฉันหน่อยได้ไหมว่ามันเป็นไปได้ที่จะโอเวอร์โหลดโอเปอเรเตอร์ใน Java หรือไม่? หากมีการใช้ที่ใดก็ได้ใน Java คุณสามารถบอกฉันเกี่ยวกับมันได้

6
ผู้ประกอบการมากไปด้วยวิธีการขยาย C #
ฉันกำลังพยายามใช้วิธีการขยายเพื่อเพิ่มตัวดำเนินการเกินพิกัดให้กับStringBuilderคลาสC # โดยเฉพาะได้รับStringBuilder sbฉันต้องการที่จะกลายเป็นเทียบเท่ากับsb += "text"sb.Append("text") นี่คือไวยากรณ์สำหรับการสร้างวิธีการขยายสำหรับStringBuilder: public static class sbExtensions { public static StringBuilder blah(this StringBuilder sb) { return sb; } } มันประสบความสำเร็จเพิ่มวิธีขยายไปยังblahStringBuilder น่าเสียดายที่การใช้งานมากเกินไปดูเหมือนจะไม่ทำงาน: public static class sbExtensions { public static StringBuilder operator +(this StringBuilder sb, string s) { return sb.Append(s); } } ในประเด็นอื่น ๆ คำหลักthisไม่ได้รับอนุญาตในบริบทนี้ มีการเพิ่มโอเปอเรเตอร์เกินพิกัดผ่านวิธีการขยายหรือไม่ ถ้าอย่างนั้นเป็นวิธีที่เหมาะสมที่จะไปเกี่ยวกับมันคืออะไร?

5
ฉันจะรับที่อยู่ของวัตถุได้อย่างน่าเชื่อถือเมื่อโอเปอเรเตอร์ & มากเกินไปได้อย่างไร
พิจารณาโปรแกรมต่อไปนี้: struct ghost { // ghosts like to pretend that they don't exist ghost* operator&amp;() const volatile { return 0; } }; int main() { ghost clyde; ghost* clydes_address = &amp;clyde; // darn; that's not clyde's address :'( } ฉันจะได้รับclydeที่อยู่ของได้อย่างไร ฉันกำลังมองหาทางออกที่จะทำงานได้ดีกับวัตถุทุกประเภท โซลูชัน C ++ 03 ก็ดี แต่ฉันก็สนใจ C ++ 11 …

14
อะไรทำให้โอเปอเรเตอร์ของ Scala โอเวอร์โหลด“ ดี” แต่ C ++ ของ“ ไม่ดี”?
ผู้ประกอบการมากไปใน C ++ นั้นหลายคนคิดว่าเป็นสิ่งไม่ดี (tm) และความผิดพลาดที่ไม่ควรทำซ้ำในภาษาที่ใหม่กว่า แน่นอนว่ามันเป็นคุณสมบัติหนึ่งที่ลดลงโดยเฉพาะเมื่อออกแบบ Java ตอนนี้ฉันเริ่มอ่าน Scala ฉันพบว่ามันมีลักษณะเหมือนตัวดำเนินการมากเกินไป (แม้ว่าในทางเทคนิคแล้วมันไม่มีตัวดำเนินการมากไปเพราะมันไม่มีตัวดำเนินการฟังก์ชันเท่านั้น) อย่างไรก็ตามดูเหมือนว่าจะไม่แตกต่างจากผู้ประกอบการมากไปใน C ++ ซึ่งผมจำได้ว่าผู้ประกอบการได้รับการกำหนดให้เป็นฟังก์ชั่นพิเศษ ดังนั้นคำถามของฉันคืออะไรทำให้แนวคิดของการกำหนด "+" ใน Scala เป็นความคิดที่ดีกว่าใน C ++

9
มีเหตุผลจริงหรือไม่ที่ทำให้เกิดการ && และ || มากเกินไป อย่าลัดวงจร?
พฤติกรรมการลัดวงจรของผู้ปฏิบัติงาน&amp;&amp;และ||เป็นเครื่องมือที่ยอดเยี่ยมสำหรับโปรแกรมเมอร์ แต่ทำไมพวกเขาถึงสูญเสียพฤติกรรมนี้เมื่อทำงานหนักเกินไป? ฉันเข้าใจว่าตัวดำเนินการเป็นเพียงน้ำตาลเชิงซ้อนสำหรับฟังก์ชั่น แต่ผู้ปฏิบัติงานboolมีพฤติกรรมนี้ทำไมจึงต้อง จำกัด ประเภทเดียวนี้ มีเหตุผลทางเทคนิคที่อยู่เบื้องหลังสิ่งนี้หรือไม่?

5
ตัวดำเนินการเข้าถึงสมาชิกมากเกินไป ->,. *
ผมเข้าใจมากไปผู้ประกอบการส่วนใหญ่มีข้อยกเว้นของผู้ประกอบการเข้าถึงสมาชิกที่-&gt;, .*, -&gt;*ฯลฯ โดยเฉพาะอย่างยิ่งสิ่งที่ส่งผ่านไปยังฟังก์ชันตัวดำเนินการเหล่านี้และสิ่งที่ควรส่งคืน? ฟังก์ชันตัวดำเนินการ (เช่นoperator-&gt;(...)) รู้ได้อย่างไรว่าสมาชิกใดถูกอ้างถึง? มันรู้ได้ไหม? มันจำเป็นต้องรู้หรือไม่? สุดท้ายมีข้อพิจารณาใดบ้างที่ต้องนำมาพิจารณา? ตัวอย่างเช่นเมื่อมีการใช้งานมากเกินไปoperator[]โดยทั่วไปคุณจะต้องมีทั้งเวอร์ชัน const และไม่ใช่ const ตัวดำเนินการเข้าถึงสมาชิกต้องการเวอร์ชัน const และ non-const หรือไม่?

8
ตัวดำเนินการ << ควรดำเนินการในฐานะเพื่อนหรือเป็นฟังก์ชันของสมาชิก?
นั่นคือคำถามโดยพื้นฐานแล้วมีวิธีที่ "ถูกต้อง" ในการนำไปใช้operator&lt;&lt;หรือไม่? อ่านสิ่งนี้ฉันจะเห็นว่าสิ่งที่ชอบ: friend bool operator&lt;&lt;(obj const&amp; lhs, obj const&amp; rhs); เป็นที่ต้องการของบางสิ่งเช่น ostream&amp; operator&lt;&lt;(obj const&amp; rhs); แต่ฉันไม่สามารถเข้าใจได้ว่าทำไมฉันจึงควรใช้อย่างใดอย่างหนึ่ง กรณีส่วนตัวของฉันคือ: friend ostream &amp; operator&lt;&lt;(ostream &amp;os, const Paragraph&amp; p) { return os &lt;&lt; p.to_str(); } แต่ฉันอาจจะทำได้: ostream &amp; operator&lt;&lt;(ostream &amp;os) { return os &lt;&lt; paragraph; } ฉันควรใช้เหตุผลใดในการตัดสินใจนี้ หมายเหตุ : Paragraph::to_str = (return …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.