คำถามติดแท็ก c++

คำถามเกี่ยวกับ C ++ ซึ่งเป็นภาษาการเขียนแบบสแตติกแบบหลายกระบวนทัศน์รวบรวมภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไป

2
RAII คืออะไร ตัวอย่าง?
ทุกครั้งที่มีการใช้คำว่า RAII ผู้คนกำลังพูดถึง deconstruction แทนการกำหนดค่าเริ่มต้น ฉันคิดว่าฉันมีความเข้าใจพื้นฐานสิ่งที่อาจหมายถึง แต่ฉันไม่แน่ใจ นอกจากนี้: C ++ เป็นภาษา RAII เดียวหรือไม่ Java หรือ C # /. NET เป็นอย่างไร
19 c++ 

7
ปัญหาเกี่ยวกับรูปแบบการเข้ารหัส: เราควรมีฟังก์ชั่นที่ใช้พารามิเตอร์แก้ไขหรือไม่แล้วกลับไปที่พารามิเตอร์นั้นหรือไม่
ฉันกำลังถกเถียงกับเพื่อนของฉันเล็กน้อยว่าการปฏิบัติทั้งสองนี้เป็นเพียงแค่สองด้านของเหรียญเดียวกันหรือไม่หรือว่าจะดีกว่าอย่างแท้จริง เรามีฟังก์ชั่นที่รับพารามิเตอร์เติมสมาชิกของมันแล้วส่งกลับ: Item predictPrice(Item item) ฉันเชื่อว่ามันทำงานบนวัตถุเดียวกับที่ส่งผ่านไม่มีจุดที่จะส่งคืนรายการ ในความเป็นจริงถ้ามีอะไรจากมุมมองของผู้โทรมันสับสนเรื่องที่คุณอาจคาดหวังให้กลับรายการใหม่ที่มันไม่ เขาอ้างว่ามันไม่สร้างความแตกต่างและมันก็ไม่สำคัญว่ามันจะสร้างไอเท็มใหม่และคืนสิ่งนั้น ฉันไม่เห็นด้วยอย่างยิ่งด้วยเหตุผลดังต่อไปนี้: หากคุณมีการอ้างอิงหลายรายการไปยังรายการที่ผ่าน (หรือพอยน์เตอร์หรืออะไรก็ตาม) มันจะจัดสรรวัตถุใหม่และส่งคืนเป็นสิ่งสำคัญเนื่องจากการอ้างอิงเหล่านั้นจะไม่ถูกต้อง ในภาษาที่ไม่มีการจัดการหน่วยความจำฟังก์ชั่นการจัดสรรอินสแตนซ์ใหม่อ้างว่าเป็นเจ้าของหน่วยความจำและดังนั้นเราจะต้องใช้วิธีการล้างข้อมูลที่เรียกว่าในบางจุด การจัดสรรฮีปอาจมีราคาแพงและดังนั้นจึงเป็นสิ่งสำคัญที่ฟังก์ชันที่เรียกใช้ทำเช่นนั้น ดังนั้นฉันเชื่อว่ามันเป็นสิ่งสำคัญมากที่จะสามารถดูผ่านลายเซ็นวิธีการไม่ว่าจะแก้ไขวัตถุหรือจัดสรรใหม่ ดังนั้นฉันเชื่อว่าเนื่องจากฟังก์ชั่นเพียงแค่ปรับเปลี่ยนวัตถุที่ส่งผ่านลายเซ็นควรจะ: void predictPrice(Item item) ในทุก codebase (ยอมรับกันว่า C และ C ++ codebases ไม่ใช่ภาษาจาวาซึ่งเป็นภาษาที่เรากำลังทำงานอยู่) ฉันได้ทำงานด้วยสไตล์ข้างต้นได้ยึดติดเป็นหลักและเก็บไว้โดยโปรแกรมเมอร์ที่มีประสบการณ์มากกว่า เขาอ้างว่าเนื่องจากขนาดตัวอย่างของโค๊ดเบสและเพื่อนร่วมงานของฉันนั้นเล็กมากจากโค๊ดและเพื่อนร่วมงานที่เป็นไปได้ทั้งหมดดังนั้นประสบการณ์ของฉันจึงไม่มีตัวบ่งชี้ที่แท้จริงว่ามีใครเหนือกว่า ดังนั้นความคิดใด ๆ

4
ทำความเข้าใจกับกรอบสแต็คของการเรียกใช้ฟังก์ชันใน C / C ++ หรือไม่
ฉันกำลังพยายามที่จะเข้าใจว่าสแต็คเฟรมถูกสร้างขึ้นและตัวแปรใด (params) ถูกผลักไปยังสแต็กตามลำดับ ผลลัพธ์การค้นหาบางรายการแสดงว่าคอมไพเลอร์ C / C ++ ตัดสินใจตามการดำเนินการที่ดำเนินการภายในฟังก์ชั่น ตัวอย่างเช่นถ้าฟังก์ชั่นควรจะเพิ่มค่าการส่งผ่านโดย 1 (คล้ายกับตัวดำเนินการ ++) และส่งกลับมันจะทำให้พารามิเตอร์ทั้งหมดของฟังก์ชั่นและตัวแปรท้องถิ่นในการลงทะเบียน ฉันสงสัยว่าจะใช้รีจิสเตอร์ใดสำหรับพารามิเตอร์ส่งคืนหรือส่งผ่านตามค่า การอ้างอิงถูกส่งคืนอย่างไร คอมไพเลอร์เลือกระหว่าง eax, ebx, ecx และ edx อย่างไร ฉันต้องทราบอะไรบ้างในการทำความเข้าใจวิธีการลงทะเบียนการอ้างอิงสแต็คและฮีปที่ใช้สร้างและทำลายระหว่างการเรียกใช้ฟังก์ชัน
19 c++  c  compiler  stack 

8
C ++ ให้เพื่อนหรือไม่ให้เพื่อน
ฉันมีการเขียนโปรแกรมเชิงวัตถุด้วยหลักสูตร c ++ ภาคการศึกษานี้ที่วิทยาลัยและเราได้เรียนรู้เกี่ยวกับฟังก์ชั่นเพื่อน ฉันไม่ชอบพวกเขาโดยสัญชาตญาณเพราะความสามารถในการหลีกเลี่ยงความปลอดภัยที่ Encapsulation และ Data ซ่อนไว้ฉันอ่านบทความสองสามเรื่องบนอินเทอร์เน็ตและบางคนคิดว่ามันเป็นความคิดที่ดีที่มีการใช้งานที่ถูกกฎหมาย ผู้เชี่ยวชาญ OOP จะพูดอย่างไรเกี่ยวกับเพื่อน fucntions ใน C ++ ฉันควรอ่านอย่างคร่าวๆหรือควรเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้หรือไม่

8
คุณอ่านข้อผิดพลาดการคอมไพล์ C หรือ C ++ หลังจากข้อผิดพลาดแรกหรือไม่
ฉันไม่เคยเข้าใจเลยว่าทำไมคอมไพเลอร์ C และ C ++ จึงพยายามกู้คืนจากข้อผิดพลาดและทำการแยกวิเคราะห์ต่อไป เกือบตลอดเวลาข้อผิดพลาดแรกสร้างกระแสข้อผิดพลาดปลอมที่จะหายไปทันทีที่มีการแก้ไขข้อผิดพลาดแรก หลังจากประสบการณ์หลายปีฉันก็หยุดดูข้อผิดพลาดใด ๆ ยกเว้นไฟล์แรกของทุกไฟล์ ฉันรันคอมไพเลอร์แล้วทำอีกครั้งจนกว่าจะไม่มีข้อผิดพลาดอีก มันเป็นเรื่องธรรมดา

1
ทำไมลำไส้ใหญ่สองเท่าแทนที่จะเป็นจุด
มีข่าวลือว่าการใช้งาน C ++ ในช่วงต้นมีตัวดำเนินการ dot สำหรับการเข้าถึงเนมสเปซ มีความเห็นว่าจุดที่สะดวกกว่าที่ผู้ประกอบการลำไส้ใหญ่สองครั้งที่ทันสมัย อะไรคือเหตุผลที่อยู่เบื้องหลังการแนะนำลำไส้ใหญ่คู่

7
สำนวนคืออะไร?
ฉันเข้าใจ "สำนวน" เพื่อเป็นการดำเนินการทั่วไปหรือรูปแบบที่ในภาษาเฉพาะไม่ง่ายโดยไวยากรณ์ภาษาหลักเช่นการเพิ่มจำนวนเต็ม: i = i + 1; ใน C ++ สำนวนนี้จะทำให้ผู้ปฏิบัติงานง่ายขึ้น: ++i; อย่างไรก็ตามเมื่อมีคนใช้คำว่า "สำนวน" ฉันไม่แน่ใจว่าจะเข้าใจมันอย่างไร อะไรทำให้ชิ้นส่วนของรหัส "สำนวน"?
19 c++  idioms 

7
เหตุใดเราต้องรวม. h ขณะที่ทุกอย่างทำงานเมื่อรวมเฉพาะไฟล์. cpp
ทำไมเราต้องรวมทั้งไฟล์.hและ.cppในขณะที่เราสามารถทำให้มันทำงานได้โดยรวม.cppไฟล์ ตัวอย่างเช่นการสร้างfile.hที่มีการประกาศแล้วการสร้างคำนิยามที่มีและรวมทั้งในfile.cppmain.cpp อีกทางหนึ่ง: การสร้างการfile.cppประกาศ / คำจำกัดความที่มี (ไม่มีต้นแบบ) รวมถึงสิ่งmain.cppต่อไปนี้ ทั้งสองทำงานให้ฉัน ฉันไม่เห็นความแตกต่าง บางทีความเข้าใจในกระบวนการรวบรวมและเชื่อมโยงอาจช่วยได้บ้าง
18 c++  c  headers  linking  include 

2
เหตุใด C ถึงสูงมากในดัชนีความนิยมของ TIOBE ในขณะที่ C ++ ก็อยู่ที่นี่ด้วย แต่ก็ไม่ได้รับความนิยม [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการถกเถียงอภิปรายโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน6 ปีที่ผ่านมา ฉันไม่สามารถเข้าใจเรื่องนี้ได้ ถ้า C ใช้งานมาก แต่ C ไม่ใช่ C ++, บางคนสามารถอธิบายเหตุผลที่สำคัญที่สุดที่ทำให้ C ใช้มากกว่า C ++ ได้หรือไม่? รหัส C นี้เขียนไว้ที่ไหน สิ่งนี้เกี่ยวกับภาคอุตสาหกรรมที่ต้องพึ่งพาการเขียนโปรแกรมที่จำเป็นอย่างยิ่ง แต่ไม่สามารถสนับสนุนค่าใช้จ่ายในการปรับใช้หรือปรับแต่งคอมไพเลอร์ C ++ ได้หรือไม่? มีแฮ็กเกอร์เคอร์เนลจำนวนมากไหม? tiobe เกี่ยวข้องหรือไม่ ฉันไม่เคยพบบทความหรือโพสต์แสดงความคิดเห็นหรืออธิบายว่าอันดับของ tiobe นั้นเป็นอย่างไรและสิ่งที่จริงพูดเกี่ยวกับสิ่งที่อุตสาหกรรมชอบและสิ่งที่มันสามารถบอกเกี่ยวกับสิ่งที่อุตสาหกรรมใช้จริงเพื่อระบุความต้องการที่แท้จริงของอุตสาหกรรม มันยากที่จะอธิบาย. ฉันเพิ่งพบว่ามันแปลก ๆ หลาย บริษัท ต้องการงาน C #, php, java และไม่ใช่งาน C หรือ …

8
ทำไมหนังสือถึงพูดว่า“ คอมไพเลอร์จัดสรรพื้นที่สำหรับตัวแปรในหน่วยความจำ”
ทำไมหนังสือถึงพูดว่า "คอมไพเลอร์จัดสรรพื้นที่สำหรับตัวแปรในหน่วยความจำ" มันไม่สามารถเรียกใช้งานได้ ฉันหมายถึงเช่นถ้าฉันเขียนโปรแกรมต่อไปนี้ #include <iostream> using namespace std; int main() { int foo; return 0; } และคอมไพล์มันและรับไฟล์ executable (ปล่อยให้มันเป็น program.exe) ตอนนี้ถ้าฉันรัน program.exe ไฟล์ที่ปฏิบัติการได้นี้จะสั่งให้จัดสรรพื้นที่สำหรับตัวแปร foo มันจะไม่? โปรดอธิบายว่าทำไมหนังสือพูดต่อไปว่า "ผู้รวบรวมจะทำสิ่งนี้ ... ทำอย่างนั้น"
18 c++ 

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

3
เหตุใดตัวดำเนินการลูกศรใน C ++ จึงไม่ใช่เพียงนามแฝงของ *
ใน c ++ ตัวดำเนินการ * สามารถโอเวอร์โหลดได้เช่นกับตัววนซ้ำ แต่ตัวดำเนินการลูกศร (->) (. *) ไม่ทำงานกับคลาสที่โอเวอร์โหลดตัวดำเนินการ * ฉันจินตนาการว่าตัวประมวลผลล่วงหน้าสามารถแทนที่อินสแตนซ์ทั้งหมดของ -> ด้วย (* ซ้าย). right ได้อย่างง่ายดายและนั่นจะทำให้ iterators ดีกว่าที่จะใช้ มีเหตุผลในทางปฏิบัติสำหรับ -> แตกต่างหรือว่าเป็นเพียงลักษณะเฉพาะของภาษา / นักออกแบบ?
18 c++  operators 

8
มีภาษาระหว่าง C และ C ++ หรือไม่
ฉันชอบธรรมชาติที่เรียบง่ายและโปร่งใสของ C: เมื่อฉันเขียนรหัส C ฉันรู้สึกปราศจากข้อ จำกัด โดย "abstractions ที่รั่วไหล" และมักจะสามารถเดาได้อย่างชาญฉลาดเกี่ยวกับการชุมนุมที่ฉันผลิต ฉันชอบไวยากรณ์ที่เรียบง่ายและคุ้นเคยสำหรับ C. อย่างไรก็ตาม C ไม่มี doodads ที่เรียบง่ายและเป็นประโยชน์เหล่านี้ที่ C ++ นำเสนอเช่นคลาส, การจัดการที่ไม่ใช่ cstring แบบง่าย, ฯลฯ ฉันรู้ว่ามันเป็นไปได้ที่จะนำไปใช้ใน C โดยใช้ตารางกระโดดและสิ่งที่คล้ายกัน และไม่ปลอดภัยสำหรับประเภทด้วยเหตุผลต่างๆ ฉันไม่ใช่แฟนของการเน้นไปที่วัตถุใน C ++ และฉันก็อายที่จะใช้ตัวดำเนินการ 'ใหม่' และไม่ชอบ c ++ ดูเหมือนว่าจะมี hiccups มากเกินไปเพียงไม่กี่ตัวอย่างเช่นถูกใช้เป็นภาษาการเขียนโปรแกรมระบบ มีภาษาที่อยู่ระหว่าง C และ C ++ ในระดับของวิดเจ็ตและ doodads หรือไม่? ข้อจำกัดความรับผิดชอบ: ฉันหมายความว่านี่เป็นคำถามที่แท้จริง ฉันไม่ได้ตั้งใจที่จะโกรธคุณเพราะฉันไม่แบ่งปันมุมมองของคุณว่า …
18 c++  c 

3
ข้อดีของไวยากรณ์ภาษาจากซ้ายไปขวา
ฉันได้ดูบทสัมภาษณ์ของ Herb Sutter ที่ช่อง 9 และเขาพูดถึงตอนท้ายของวิดีโอว่าไวยากรณ์ของภาษาซ้าย - ขวาจะอยู่ในอันดับต้น ๆ ของนักแปลเพื่อมาตรฐาน C ++ ในอนาคต (แม้ว่าเขาจะยอมรับว่าการดัดแปลง C ++ ด้วยวิธีนั้น จะทำให้สัตว์ร้ายต่างไปจากเดิมอย่างสิ้นเชิง) นอกเหนือจาก: มนุษย์สามารถเข้าใจได้ชัดเจนขึ้นด้วยตาเปล่าเช่น //C syntax /*pointer to function taking a pointer to function(which takes 2 integers as arguments and returns an int), and an int as arguments and returning an int*/ int (*fp)(int …

10
ทำไมการสืบทอดและความหลากหลายจึงใช้กันอย่างแพร่หลาย?
ยิ่งฉันเรียนรู้เกี่ยวกับกระบวนทัศน์การเขียนโปรแกรมที่แตกต่างกันเช่นการเขียนโปรแกรมการทำงานยิ่งฉันเริ่มตั้งคำถามเกี่ยวกับภูมิปัญญาของแนวคิด OOP เช่นการสืบทอดและ polymorphism ครั้งแรกที่ฉันได้เรียนรู้เกี่ยวกับการสืบทอดและ polymorphism ในโรงเรียนและในเวลานั้น polymorphism ดูเหมือนจะเป็นวิธีที่ยอดเยี่ยมในการเขียนรหัสทั่วไปที่อนุญาตให้ขยายได้ง่าย แต่ในการเผชิญกับการพิมพ์เป็ด (ทั้งแบบไดนามิกและแบบคงที่) และฟังก์ชั่นการใช้งานเช่นฟังก์ชั่นการสั่งซื้อที่สูงขึ้นฉันได้เริ่มดูการสืบทอดและความหลากหลายในรูปแบบเพื่อกำหนดข้อ จำกัด ที่ไม่จำเป็น แนวคิดทั่วไปที่อยู่เบื้องหลัง polymorphism คือคุณเขียนฟังก์ชันหนึ่งครั้งและหลังจากนั้นคุณสามารถเพิ่มฟังก์ชันการทำงานใหม่ให้กับโปรแกรมของคุณโดยไม่ต้องเปลี่ยนฟังก์ชั่นดั้งเดิม - สิ่งที่คุณต้องทำคือสร้างคลาสอื่นที่ได้มาซึ่งใช้วิธีการที่จำเป็น แต่วิธีนี้ง่ายกว่ามากในการพิมพ์เป็ดไม่ว่าจะเป็นภาษาแบบไดนามิกเช่น Python หรือภาษาแบบคงที่เช่น C ++ ลองพิจารณาฟังก์ชั่น Python ต่อไปนี้ตามด้วย C ++ แบบคงที่: def foo(obj): obj.doSomething() template <class Obj> void foo(Obj& obj) { obj.doSomething(); } การเทียบเท่า OOP จะเหมือนกับโค้ด Java ต่อไปนี้: public void foo(DoSomethingable …

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