ฉันกำลังอ่านคำตอบสำหรับคำถามนี้ข้อดีและข้อเสีย C ++และมีข้อสงสัยนี้ในขณะที่อ่านความคิดเห็น
โปรแกรมเมอร์มักพบว่าสับสนว่า "นี่" เป็นตัวชี้ แต่ไม่ใช่การอ้างอิง ความสับสนอีกอย่างคือทำไม "hello" ไม่ใช่ type std :: string แต่ประเมินเป็น char const * (ตัวชี้) (หลังจากการแปลงอาเรย์เป็นตัวชี้) - Johannes Schaub - litb 22 ธันวาคม 2008 เวลา 1:56
นั่นแสดงให้เห็นว่ามันไม่ได้ใช้แบบแผนเดียวกับภาษาอื่น ๆ (ในภายหลัง) - เลอ dorfier 22 ธันวาคม '08 ที่ 3:35
ฉันจะเรียกสิ่งนี้ว่า "ปัญหาเล็กน้อย" และอุ๊ปส์ขอบคุณสำหรับการจับข้อผิดพลาดเล็กน้อยในตัวอย่างของพฤติกรรมที่ไม่ได้กำหนด :) ถึงแม้ว่าฉันไม่เข้าใจว่าข้อมูลเกี่ยวกับขนาดเกี่ยวข้องกับอะไรในข้อมูลแรก ตัวชี้ไม่ได้รับอนุญาตให้ชี้ออกไปนอกหน่วยความจำที่จัดสรร - วันที่ 22 ธันวาคม 2551 เวลา 4:18 น
นี่เป็นพอยน์เตอร์คงที่หรือไม่? - yesraaj 22 ธันวาคม 2551 เวลา 6:35 น
สิ่งนี้จะคงที่หากวิธีการนั้นเป็น const int getFoo () const; <- ในขอบเขตของ getFoo "this" เป็นค่าคงที่และอ่านได้อย่างเดียว สิ่งนี้จะป้องกันข้อผิดพลาดและให้การรับประกันระดับหนึ่งแก่ผู้เรียกที่วัตถุจะไม่เปลี่ยนแปลง - Doug T. 22 ธ.ค. 2551 เวลา 16:42 น
คุณไม่สามารถกำหนด "สิ่งนี้" ใหม่ได้ นั่นคือคุณไม่สามารถทำ "this = & other;" เพราะนี่เป็นค่า rvalue แต่นี่เป็นประเภท T * ไม่ใช่ของประเภท T const นั่นคือมันเป็นตัวชี้ที่ไม่คงที่ หากคุณอยู่ในวิธีการ const แล้วมันเป็นตัวชี้ไปที่ const T const แต่ตัวชี้นั้นไม่เป็นที่นิยม - Johannes Schaub - litb 22 ธันวาคม 2008 เวลา 17:53 น
คิดว่า "นี่" เป็นอย่างนี้: #define this (this_ + 0) ที่คอมไพเลอร์สร้าง "this_" นี้เป็นตัวชี้ไปยังวัตถุและทำให้ "นี่" เป็นคำหลัก คุณไม่สามารถกำหนด "this" เพราะ (this_ + 0) เป็นค่า rvalue แน่นอนว่ามันไม่เป็นเช่นนั้น (ไม่มีมาโครดังกล่าว) แต่มันสามารถช่วยให้เข้าใจได้ - โยฮันเนส Schaub - litb 22 ธันวาคม 2551 เวลา 17:55 น.
คำถามของฉันคือเหตุใดthis
ตัวชี้จึงไม่ใช่ข้อมูลอ้างอิง มีเหตุผลใดที่ทำให้เป็นตัวชี้?
ข้อโต้แย้งเพิ่มเติมว่าทำไมthis
การอ้างอิงถึงสมเหตุสมผล:
- พิจารณา
Item 1
จากMore Effective C++
: ใช้การอ้างอิงเมื่อมันรับประกันว่าเรามีวัตถุที่ถูกต้องเช่นไม่ใช่ NULL (การตีความของฉัน) - นอกจากนี้การอ้างอิงถือว่าปลอดภัยกว่าพอยน์เตอร์ (เนื่องจากเราไม่สามารถไขหน่วยความจำด้วยพอยต์เรย์)
- ประการที่สามไวยากรณ์สำหรับการเข้าถึงการอ้างอิง (
.
) เล็กน้อยดีกว่าและสั้นกว่าการเข้าถึงตัวชี้ (->
หรือ(*)
)
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
this
ประเมินเสมอไปtrue
หรือ