คำถามติดแท็ก default-constructor

3
“ = ค่าเริ่มต้น” แตกต่างจาก“ {}” สำหรับตัวสร้างและตัวทำลายเริ่มต้นอย่างไร
ฉันโพสต์สิ่งนี้เป็นคำถามเกี่ยวกับ destructors เท่านั้น แต่ตอนนี้ฉันเพิ่มการพิจารณาตัวสร้างเริ่มต้น นี่คือคำถามเดิม: ถ้าฉันต้องการให้ destructor ในชั้นเรียนของฉันเป็นเสมือน แต่อย่างอื่นเหมือนกับสิ่งที่คอมไพเลอร์จะสร้างฉันสามารถใช้=default: class Widget { public: virtual ~Widget() = default; }; แต่ดูเหมือนว่าฉันจะได้รับผลกระทบเดียวกันโดยพิมพ์น้อยลงโดยใช้คำจำกัดความที่ว่างเปล่า: class Widget { public: virtual ~Widget() {} }; มีวิธีใดบ้างที่คำจำกัดความทั้งสองนี้ทำงานต่างกัน? จากการตอบกลับที่โพสต์สำหรับคำถามนี้สถานการณ์ของ Constructor เริ่มต้นจะคล้ายกัน ระบุว่าไม่มีความแตกต่างในความหมายระหว่าง " =default" และ " {}" สำหรับ destructors มีความคล้ายคลึงกันเกือบไม่แตกต่างกันในความหมายระหว่างตัวเลือกเหล่านี้สำหรับตัวสร้างเริ่มต้นหรือไม่ นั่นคือสมมติว่าฉันต้องการสร้างประเภทที่วัตถุประเภทนั้นจะถูกสร้างขึ้นและถูกทำลายทำไมฉันอยากจะพูด Widget() = default; แทน Widget() {} ? ฉันขออภัยหากการขยายคำถามนี้หลังจากการโพสต์ต้นฉบับละเมิดกฎ SO …

11
ทำไมคอนสตรัคเตอร์แบบไร้พารามิเตอร์เริ่มหายไปเมื่อคุณสร้างด้วยพารามิเตอร์
ใน C #, C ++ และ Java เมื่อคุณสร้างคอนสตรัคเตอร์ที่รับพารามิเตอร์พารามิเตอร์ไร้ค่าเริ่มต้นจะหายไป ฉันยอมรับข้อเท็จจริงนี้มาโดยตลอด แต่ตอนนี้ฉันเริ่มสงสัยแล้วว่าทำไม อะไรคือสาเหตุของพฤติกรรมนี้? มันเป็นเพียงแค่ "มาตรการความปลอดภัย / คาดเดา" การพูดว่า "ถ้าคุณสร้างคอนสตรัคเตอร์ของคุณเองคุณอาจไม่ต้องการให้สิ่งนี้แฝงตัว" หรือมีเหตุผลทางเทคนิคที่ทำให้คอมไพเลอร์ไม่สามารถเพิ่มได้เมื่อคุณสร้าง Constructor ด้วยตัวเอง?

11
Kotlin กับ JPA: นรกตัวสร้างเริ่มต้น
ตามที่ JPA ต้องการ@Entityคลาสควรมีคอนสตรัคเตอร์เริ่มต้น (ไม่ใช่อาร์กิวเมนต์) เพื่อสร้างอินสแตนซ์อ็อบเจ็กต์เมื่อดึงข้อมูลจากฐานข้อมูล ใน Kotlin คุณสมบัติสะดวกมากที่จะประกาศภายในตัวสร้างหลักดังตัวอย่างต่อไปนี้: class Person(val name: String, val age: Int) { /* ... */ } แต่เมื่อคอนสตรัคเตอร์ที่ไม่ใช่อาร์กิวเมนต์ถูกประกาศเป็นตัวสร้างรองจะต้องมีการส่งผ่านค่าสำหรับตัวสร้างหลักดังนั้นจึงจำเป็นต้องมีค่าที่ถูกต้องสำหรับพวกเขาเช่นที่นี่: @Entity class Person(val name: String, val age: Int) { private constructor(): this("", 0) } ในกรณีที่คุณสมบัติมีบางประเภทที่ซับซ้อนมากกว่า just StringและIntและไม่เป็นโมฆะมันดูไม่ดีเลยที่จะระบุค่าสำหรับพวกเขาโดยเฉพาะอย่างยิ่งเมื่อมีโค้ดจำนวนมากในตัวสร้างและinitบล็อกหลักและเมื่อมีการใช้พารามิเตอร์ - - เมื่อพวกเขาจะถูกกำหนดใหม่โดยการสะท้อนรหัสส่วนใหญ่จะถูกเรียกใช้งานอีกครั้ง ยิ่งไปกว่านั้นval-properties ไม่สามารถกำหนดใหม่ได้หลังจากตัวสร้างดำเนินการดังนั้นความไม่เปลี่ยนรูปจึงหายไปด้วย คำถามคือ: โค้ด Kotlin สามารถปรับให้เข้ากับ JPA ได้อย่างไรโดยไม่ต้องทำซ้ำรหัสโดยเลือกค่าเริ่มต้น "magic" …

3
เงื่อนไขสำหรับการสร้าง ctor เริ่มต้น / คัดลอก / ย้ายอัตโนมัติและตัวดำเนินการกำหนดสำเนา / ย้าย?
ฉันต้องการรีเฟรชหน่วยความจำของฉันตามเงื่อนไขที่คอมไพลเลอร์มักสร้างตัวสร้างเริ่มต้นตัวสร้างการคัดลอกและตัวดำเนินการกำหนดโดยอัตโนมัติ ฉันจำได้ว่ามีกฎบางอย่าง แต่ฉันจำไม่ได้และยังไม่พบแหล่งข้อมูลที่มีชื่อเสียงทางออนไลน์ ใครสามารถช่วย?

5
ค่าเริ่มต้นเริ่มต้นของ std :: array?
ด้วย C ++ 11 std::arrayฉันรับประกันว่าไวยากรณ์std::array<T, N> x;จะเริ่มต้นองค์ประกอบทั้งหมดของอาร์เรย์เป็นค่าเริ่มต้นหรือไม่ แก้ไข : ถ้าไม่มีมีไวยากรณ์ที่จะทำงานกับอาร์เรย์ทั้งหมด (รวมถึงอาร์เรย์ขนาดศูนย์) เพื่อเริ่มต้นองค์ประกอบทั้งหมดเป็นค่าเริ่มต้นหรือไม่ แก้ไข : ในcppreferenceคำอธิบายตัวสร้างเริ่มต้นกล่าวว่า: (constructor) (implicitly declared) (public member function) default-constructs or copy-constructs every element of the array ดังนั้นคำตอบอาจเป็นใช่ แต่ฉันต้องการให้แน่ใจว่าเป็นไปตามมาตรฐานหรือมาตรฐานในอนาคต

4
การสร้างอินสแตนซ์ประเภทโดยไม่มีตัวสร้างเริ่มต้นใน C # โดยใช้การสะท้อน
ยกตัวอย่างชั้นเรียนต่อไปนี้: class Sometype { int someValue; public Sometype(int someValue) { this.someValue = someValue; } } จากนั้นฉันต้องการสร้างอินสแตนซ์ประเภทนี้โดยใช้การสะท้อน: Type t = typeof(Sometype); object o = Activator.CreateInstance(t); โดยปกติสิ่งนี้จะใช้งานได้อย่างไรก็ตามเนื่องจากSomeTypeไม่ได้กำหนดคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์การเรียกใช้Activator.CreateInstanceจะทำให้เกิดข้อยกเว้นของประเภทที่MissingMethodExceptionมีข้อความ " ไม่มีตัวสร้างที่ไม่มีพารามิเตอร์กำหนดไว้สำหรับอ็อบเจ็กต์นี้ " มีวิธีอื่นในการสร้างอินสแตนซ์ของประเภทนี้หรือไม่ มันเป็นเรื่องที่แย่มากที่จะเพิ่มตัวสร้างแบบไม่มีพารามิเตอร์ให้กับทุกชั้นเรียนของฉัน

3
คอนสตรัคเตอร์ส่วนตัวไม่ใช่คอนสตรัคเตอร์ส่วนตัวเมื่อใด
สมมติว่าฉันมีประเภทและฉันต้องการทำให้ตัวสร้างเริ่มต้นเป็นแบบส่วนตัว ฉันเขียนสิ่งต่อไปนี้: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); …

1
ตัวดำเนินการใหม่ () ทำงานแตกต่างกันเมื่อตัวดำเนินการลบ () ถูกลบทั้งนี้ขึ้นอยู่กับการมีอยู่ของตัวสร้างเริ่มต้น
การสร้างออบเจ็กต์ใหม่ของคลาส C โดยมีโอเปอเรเตอร์ new () ให้ข้อผิดพลาดที่นี่: class C { public: C() {} virtual ~C() {} void operator delete(void*) = delete; }; int main() { C* c = new C; } กับ C2280: 'void C::operator delete(void *)': function was explicitly deleted แต่เมื่อฉันแทนที่C() {} ด้วยC() = default; หรือลบบรรทัดเพื่อให้คอมไพเลอร์แทรกตัวสร้างเริ่มต้น (ซึ่งฉันเชื่อว่ามีผลเหมือนกันกับ= default) รหัสจะรวบรวมและเรียกใช้ อะไรคือความแตกต่างระหว่างตัวสร้างเริ่มต้นที่คอมไพเลอร์ที่สร้างโดยผู้ใช้ที่กำหนดโดยค่าเริ่มต้นที่ทำให้สิ่งนี้เกิดขึ้น? …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.