ถูกต้องหรือไม่ที่จะบอกว่าตัวแปรเป็นตัวอย่างของชนิดข้อมูล


9

(ที่สามารถเปลี่ยนค่าได้ตลอดหลักสูตร)

หรือ 'อินสแตนซ์ของบางสิ่งบางอย่าง' เกี่ยวข้องกับคลาสและวัตถุอย่างเคร่งครัดหรือไม่ ถ้าเป็นเช่นนั้นคุณจะกำหนดแนวคิดของ 'ตัวแปร' เมื่อมันมาถึง C ++ อย่างไร


C # และ Java แตกต่างจาก C ++ ในสองวิธีที่น่าสนใจ ขั้นแรกพวกเขาพยายามที่จะรวมชนิดดั้งเดิมด้วยประเภทวัตถุ (และโครงสร้าง) (เพื่อให้คุณสามารถพูดคุยเกี่ยวกับอินสแตนซ์ของ int) ในขณะที่ C ++ ไม่ ประการที่สองใน C # และ Java ตัวแปรประเภทวัตถุจะอ้างอิงไปยังอินสแตนซ์ (ของคลาส) ใน heap โดยปริยายและเราไม่ได้พูดถึงพอยน์เตอร์ไปยังวัตถุในขณะที่ใน C ++ เช่นคำตอบของ @ coredump ตัวแปรท้องถิ่นของประเภทวัตถุ เป็นการเชื่อมโยงกับอินสแตนซ์บนสแต็กและเราแยกความแตกต่างระหว่างออบเจ็กต์และพอยน์เตอร์กับออบเจ็กต์อย่างชัดเจน
Erik Eidt

คำตอบ:


8

เท่าที่ฉันรู้มันถูกต้องในการเรียกค่าของอินสแตนซ์ประเภทดั้งเดิมของประเภท นั้น (ดูตัวอย่าง"C + Type System"จากคู่มือของ Visual Studio แต่ฉันยังคงมองหาแหล่งอื่น) แม้ว่าฉันเชื่อว่าคำนี้ ส่วนใหญ่จะใช้เมื่อพูดคุยวัตถุ วัตถุเป็นตัวอย่างของคลาส C ถ้ามันถูกสร้างขึ้นจากคอนสตรัคเตอร์ที่กำหนดในคลาส C หรือหนึ่งในคลาสย่อยของมัน

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


2
" คุณค่าของประเภทดั้งเดิมมักจะไม่กล่าวว่าเป็นอินสแตนซ์ของประเภทนั้น แต่สงวนไว้สำหรับวัตถุและคลาส " นั่นไม่จริงเลย ไม่มีที่ไหนในมาตรฐานที่มีค่าประเภทดั้งเดิมไม่ถือว่าเป็นวัตถุ คำจำกัดความของตัวแปรไม่เปลี่ยนแปลงไม่ว่าในทางใดก็ตามขึ้นอยู่กับว่าเป็นคลาสที่ผู้ใช้กำหนดเองหรือประเภทดั้งเดิม
Nicol Bolas

@ NicolBolas ฉันไม่เคยได้ยินใครพูดถึงจำนวนเต็มว่าเป็นอินสแตนซ์ของบางสิ่งบางอย่างในบริบทของ C ++ และฉันค่อนข้างแน่ใจว่าถูกต้องที่จะบอกว่าพวกเขาไม่ใช่อินสแตนซ์ของสิ่งใดแม้ว่ามาตรฐานไม่ได้กล่าวถึงอย่างชัดเจน ถ้าไม่พวกเขามีอินสแตนซ์ของอะไร ฉันไม่เห็นด้วยว่าคำตอบนี้อ้างว่าคำนิยามของตัวแปรเปลี่ยนแปลงระหว่างชนิดดั้งเดิมและวัตถุ ดูเหมือนว่าจะเป็น (afaik อย่างถูกต้อง) โดยอ้างว่า "อินสแตนซ์" นั้นไม่มีอะไรเกี่ยวข้องกับคำจำกัดความของตัวแปร
Ixrec

2
@Ixrec: " ถ้าไม่ได้สิ่งที่พวกเขามีกรณีของ? " intประเภท มาตรฐาน C ++ ไม่ได้ทำให้ความแตกต่างระหว่างชนิดดั้งเดิมและประเภทที่ไม่ใช่ดั้งเดิมเมื่อพูดถึงการประกาศตัวแปรทำอะไร ดังนั้นT t;ประกาศวัตถุประเภทTไม่ว่าTจะเกิดอะไรขึ้น
Nicol Bolas

1
@Ixrec: โปรดทราบว่าตัวอักษรเป็นสิ่งที่แตกต่าง ตัวอักษรเป็นชนิดที่แพร่หลาย แต่คุณไม่สามารถสร้างตัวแปรตามตัวอักษรได้นั่นคือการสนทนาที่แตกต่าง
Nicol Bolas

5

หรือ 'อินสแตนซ์ของบางสิ่งบางอย่าง' เกี่ยวข้องกับคลาสและวัตถุอย่างเคร่งครัดหรือไม่ ถ้าเป็นเช่นนั้นคุณจะกำหนดแนวคิดของ 'ตัวแปร' เมื่อมันมาถึง C ++ อย่างไร

เพื่อให้มันรัดกุมที่สุดสำหรับ C ++

  • ตัวแปรเป็นชื่อ (ในรหัส) สำหรับสถานที่ในหน่วยความจำที่จะได้รับการพิจารณาที่รันไทม์
  • เช่นเป็นวัตถุที่อยู่ในความทรงจำที่รันไทม์

เพียงเพื่อให้ชัดเจน:

  • พื้นที่หน่วยความจำบางส่วนมีวัตถุ ตัวอย่างเช่นบางพื้นที่ของหน่วยความจำอาจมีค่า 'ขยะ'
  • หน่วยความจำเก็บวัตถุทั้งหมดจะได้รับชื่อในรหัส วัตถุอาจอยู่ในพื้นที่ที่ไม่มีชื่อของหน่วยความจำเช่นตำแหน่งในอาเรย์หรือที่ไหนสักแห่งในฮีปอ้างอิงโดยตัวชี้
  • เมื่อพื้นที่ของหน่วยความจำมีขยะมักเป็นเพราะไม่มีวัตถุใดถูกตั้งค่าไว้ในตำแหน่งนั้นหรือเนื่องจากวัตถุที่มีอยู่ก่อนหน้านี้บางส่วนถูกทำลาย

1
PODs เป็นวัตถุใน C ++ หน่วยความจำบางส่วนไม่ใช่วัตถุ แต่ POD ไม่ได้เป็นเพียงส่วนหนึ่งของหน่วยความจำ
Nicol Bolas

1
ฉัน NicolBolas ที่สอง: POD เป็นวัตถุ อย่างไรก็ตามคุณมีจุดเมื่อพูดถึงmalloc()บัฟเฟอร์ใหม่แต่ไม่มีการเตรียมการ: มันเป็นพื้นที่หน่วยความจำที่ยังไม่เป็นวัตถุ ในทำนองเดียวกันวัตถุที่ถูกทำลายอย่างชัดเจน: มันเป็นพื้นที่หน่วยความจำที่ไม่ใช่วัตถุอีกต่อไป
cmaster - คืนสถานะโมนิก้า

ความคิดเห็นที่เป็นธรรม @NicolBolas ฉันได้เปลี่ยนถ้อยคำนั้นเล็กน้อย
Ben Cottrell

1

"แก้ไข" หมายถึงอะไร?

หากเราต้องการเข้มงวดมากเกี่ยวกับเรื่องนี้เราจำเป็นต้องแยกแยะระหว่าง:

  • ไวยากรณ์ด้านการแสดงออก มี (คงที่) ประเภท
  • ความหมายด้านวัตถุมีกรณีของชั้นเรียน

ดังนั้นตัวแปร - เป็นนิพจน์ - จะมีชนิด คุณค่าของมัน - วัตถุที่อ้างถึง - จะเป็นตัวอย่างของบางคลาส และโปรดทราบว่าประเภทของตัวแปรและคลาสของวัตถุนั้นไม่ใช่สิ่งเดียวกัน - ประเภทของตัวแปรนั้นทำให้ขอบเขตบนของคลาสรันไทม์ของวัตถุดังนั้นคลาสจะต้องเป็นชนิดย่อยของคลาสที่สอดคล้องกับประเภทนั้น

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


1

นอกเสียจากว่าคุณต้องการใช้เวลาทั้งชีวิตในเรื่องของความพิถีพิถันและความละเอียดอ่อน ... ใช่

ทุกครั้งที่คุณเก็บบางสิ่งที่ระบุการใช้เพื่อปลอมแปลงสิ่งอื่น ๆ ที่สามารถระบุตัวตนของคุณได้

  • โครงการยกตัวอย่างเป็นผลิตภัณฑ์
  • แหล่งอินสแตนซ์ลงในไฟล์เรียกทำงาน
  • แม่แบบยกตัวอย่างเป็นประเภท
  • ประเภทอินสแตนซ์เป็นตัวแปร

บางอินสแตนซ์เหล่านั้นอาจมีชื่อที่แม่นยำกว่า แต่โดยทั่วไปแล้วงานนี้


0

หลายคนจอง "อินสแตนซ์" สำหรับอินสแตนซ์ของคลาส หากคุณทำเช่นนั้นใน C ++ ตัวแปรอาจเป็นอินสแตนซ์ของคลาสการอ้างอิงไปยังอินสแตนซ์ตัวชี้ไปยังอินสแตนซ์หรือประเภทดั้งเดิม (คุณน่าจะนับ struct เป็นคลาสในบริบทนั้น สมบูรณ์เหมือนกัน) ใน Java หรือ Objective-C ตัวแปรจะไม่เป็นอินสแตนซ์ แต่อาจอ้างอิงไปยังอินสแตนซ์

ลืม: ในช่วงเวลาสั้น ๆ ตัวชี้ C ++ สามารถเป็นตัวชี้ไปยังหน่วยความจำดิบตัวอย่างเช่น "this" ก่อนที่ Constructor จะเริ่มดำเนินการ คุณน่าจะไม่โทร * นี่เป็นตัวอย่างในตอนนี้

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