รายการการเริ่มต้นสมาชิกคัดลอกสตริง C ++ หรือไม่

ถ้าฉันใช้รายการการเริ่มต้นสมาชิกในตัวสร้างคลาสของฉันที่มี char* อยู่ในนั้นจะคัดลอกค่าไปยังหน่วยความจำที่จัดสรรใหม่หรือเพียงชี้ตัวชี้ไปที่ค่าเดียวกันหรือไม่

ex.

MyString::MyString(const MyString & other) : m_str(other.m_str) {}

จะไม่เป็นไรหรือฉันควรเรียกใช้ทีละเซลล์เพื่อคัดลอกข้อมูล

แก้ไข: เพียงเพื่อชี้แจงคำถามที่ฉันเปลี่ยนบรรทัด


person Ofek .T.    schedule 25.01.2016    source แหล่งที่มา
comment
คุณอาจต้องการดู: กฎสามข้อคืออะไร   -  person NathanOliver    schedule 25.01.2016
comment
เรียกว่า รายการการเริ่มต้น เนื่องจากเป็นรายการการเริ่มต้น มันจะทำสิ่งเดียวกันกับ char *m_str = other.m_str;   -  person M.M    schedule 25.01.2016
comment
โปรดระบุคำจำกัดความโครงกระดูกที่เกี่ยวข้องกับชั้นเรียนของคุณเป็นอย่างน้อย   -  person Kerrek SB    schedule 25.01.2016
comment
เมื่อคุณบอกว่ามันคัดลอกค่าหรือไม่ ก) มันหมายถึงคอนสตรัคเตอร์หรือไม่ (ถ้าเป็นเช่นนั้น โปรดพูดอย่างนั้นและอย่าเล่นเกมสรรพนาม) และ b) คัดลอกค่า หมายถึงคัดลอกสตริงที่ตัวชี้ชี้ แทนที่จะคัดลอกค่าของตัวชี้?   -  person Kerrek SB    schedule 25.01.2016
comment
จะไม่เป็นไรหรือฉันควรเรียกใช้ทีละเซลล์เพื่อคัดลอกข้อมูล ทำให้ค่อนข้างชัดเจน ฉันว่า   -  person Lightness Races in Orbit    schedule 25.01.2016
comment
โปรดชี้แจงว่าอะไรดีหมายถึงอะไร โปรดแสดงตัวทำลายล้างของชั้นเรียนของคุณหากคุณได้กำหนดไว้   -  person Kerrek SB    schedule 25.01.2016
comment
ฉันได้คำตอบแล้ว ดังนั้นคุณก็แค่ลืมมันไปซะ ฉันไม่จำเป็นต้องแสดงตัวทำลายล้างให้ใครเห็นเพราะมันเป็นคำถามทั่วไป ฉันแค่ใส่โค้ดเป็นตัวอย่างของการเรียก IL ฉันสงสัยว่ามันจะทำซ้ำตัวชี้ที่ชี้ไปที่ char[] หรือมันจะคัดลอก char[] ลึก ๆ และสร้างตัวชี้สำหรับสิ่งนั้น ฉันคิดไว้แล้วว่ามันจะไม่คัดลอกลึก แต่ขอให้อยู่ในด้านที่ปลอดภัย ดังนั้นฉันจึงได้คำตอบเพราะใน IL มันแค่คัดลอกสิ่งที่ได้รับแบบแบนๆ ราวกับว่ามันเป็นพอยน์เตอร์ มันก็จะคัดลอกพอยน์เตอร์เอง ขอบคุณ ตอนนี้ฉันชัดเจนแล้วและไม่จำเป็นต้องมีคำถามเพิ่มเติมอีกใช่ไหม   -  person Ofek .T.    schedule 26.01.2016


คำตอบ (3)


ฉันแค่คัดลอกพอยน์เตอร์ ดังนั้นทั้งคู่จะชี้ไปที่สตริงเดียวกัน

นี่อาจทำให้เกิดปัญหาได้หากคุณต้องการลบสตริงแบบชี้ไปที่ในภายหลัง

person Bo Persson    schedule 25.01.2016
comment
ขอบคุณ ทั้งหมดที่ฉันอยากรู้ว่ามันจะคัดลอก ptr หรือค่าไปยังพื้นที่ใหม่หรือไม่ - person Ofek .T.; 25.01.2016
comment
@ Ofek.T.: แน่นอนคุณสามารถระบุตัวเองได้โดยเพียงแค่พิมพ์พอยน์เตอร์ทั้งสองเป็น void* และเปรียบเทียบ - person Lightness Races in Orbit; 25.01.2016

มันทำทั้งสองอย่าง:

  • มันคัดลอกตัวชี้

  • สำเนาของตัวชี้จะชี้ไปที่สิ่งเดียวกันกับต้นฉบับ

person Kerrek SB    schedule 25.01.2016
comment
นี่ไม่ใช่ทั้งในแง่ที่ OP อธิบายไว้ - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: อืม... อาจจะมีการกระดิกเชิงตีความมากมาย ... แต่ตามที่เขียนไว้ OP บอกว่าชั้นเรียนของฉันมีตัวชี้ถ่านอยู่ในนั้น ตัวสร้างการคัดลอกคัดลอกค่าหรือไม่ ซึ่งมันทำ - person Kerrek SB; 25.01.2016
comment
ฉันไม่คิดว่าการไม่เพิกเฉยต่อคำห้าคำถัดไปถือเป็นการกระดิกตีความหมายได้มากมายตรงไปตรงมา มันคัดลอกค่าไปยังหน่วยความจำที่จัดสรรใหม่หรือไม่ ค่อนข้างชัดเจนว่า OP หมายถึงสำเนาแบบลึกที่นี่ - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: ตัวชี้ ถูก คัดลอกไปยังหน่วยความจำที่จัดสรรใหม่ นั่นคือหน่วยความจำที่จัดสรรสำหรับอินสแตนซ์ MyString ใหม่ ฉันคิดอย่างรอบคอบว่าการละเว้นจะส่งผลต่อความหมายหรือไม่ และตัดสินใจว่าจะไม่เป็นเช่นนั้น - person Kerrek SB; 25.01.2016
comment
จริงเหรอ? ไม่มันจะไม่ แต่เราไม่ได้พูดถึงสิ่งที่ คืออะไร; เรากำลังพูดถึงความหมายของ OP ในคำถาม และฉันใช้การวิเคราะห์พฤติกรรมอย่างระมัดระวังเพื่อพิจารณาว่ามีแนวโน้มว่า OP จะถามเกี่ยวกับสำเนาแบบลึกและแบบตื้นมากกว่าที่ OP ถามเกี่ยวกับสำเนาแบบตื้นและแบบตื้น (??? ). - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: ฉันเข้าใจหมดแล้ว ปัญหาคือว่า OP สร้างความสับสนอย่างน่าสยดสยองเกี่ยวกับความหมายของคำเกือบทุกคำในคำถาม ฉันคิดว่าจะดีกว่ามากถ้าแก้ไขคำถามก่อนแล้วจึงตอบคำถามที่ชัดเจน - person Kerrek SB; 25.01.2016
comment
ฉันด้วย! คุณจะสังเกตได้ว่าฉันไม่ได้ตอบเหมือนกับคุณ ;) xxx - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: ตั้งข้อสังเกต :-) และเริ่มดำเนินการตามชุดความคิดเห็นเพื่อขอให้คำถามได้รับการแก้ไข - person Kerrek SB; 25.01.2016
comment
ฉันขอให้คุณโชคดีในภารกิจของคุณ! - person Lightness Races in Orbit; 25.01.2016

ตัวแปรพอยน์เตอร์คือ (ในลักษณะที่เรียบง่ายในการมอง) โดยพื้นฐานแล้วไม่มีอะไรมากไปกว่าตัวแปรจำนวนเต็มที่ได้รับการจัดการเป็นพิเศษโดยคอมไพเลอร์ เนื้อหาของตัวแปรตัวชี้ (เริ่มต้น) คือ ที่อยู่ ที่ชี้ไปในหน่วยความจำ

หากคุณเตรียมใช้งานตัวแปรพอยน์เตอร์ตัวหนึ่งไปยังเนื้อหาของตัวแปรพอยน์เตอร์อื่น คุณจะคัดลอกเนื้อหา ซึ่งนำไปสู่ตัวแปรสองตัวที่แตกต่างกันซึ่งมีเนื้อหาเหมือนกันและทั้งสองตัวชี้ไปที่หน่วยความจำเดียวกัน

person Some programmer dude    schedule 25.01.2016
comment
ผิดหวังที่เห็นคนฉลาดเช่นคุณเผยแพร่คำแนะนำนี้เป็นเรื่องไร้สาระ! - person Lightness Races in Orbit; 25.01.2016
comment
@Lightness Races in Orbit คุณสามารถเพิ่มลิงก์หรือคำอธิบายว่าทำไมตัวชี้ไม่ควรถือเป็น ผู้ถือที่อยู่ - person Ziezi; 25.01.2016
comment
@simplicisveritatis ไวยากรณ์ ping ไม่มีช่องว่างในนั้น (เช่น ดูสิ่งที่ฉันทำในข้อความนี้) หากคุณเริ่มพิมพ์ชื่อแล้วกด Tab ระบบจะเติมไวยากรณ์ที่ถูกต้องโดยอัตโนมัติ ฉันสงสัยว่า LRiO หมายถึงการอ้างถึงพอยน์เตอร์เป็นจำนวนเต็มไร้สาระ ... ไม่เช่นนั้นฉันก็ไม่รู้ว่าเขากำลังพูดถึงอะไร - person M.M; 25.01.2016