C ++ - เหตุใดจึงไม่สามารถสร้างฟังก์ชันสมาชิกแบบคงที่ด้วยคุณสมบัติ 'const'


87

วันนี้ฉันมีปัญหา ฉันต้องการstaticฟังก์ชั่นสมาชิกconstไม่ใช่สิ่งที่จำเป็น แต่เป็นสิ่งที่ดีกว่า แต่ฉันไม่ประสบความสำเร็จในความพยายามของฉัน ใครสามารถพูดได้ว่าทำไมหรืออย่างไร?


1
constฟังก์ชันสมาชิกแบบคงที่มีความหมายกับคุณอย่างไร?
GManNickG

2
@GMan ฉันหมายถึงฟังก์ชันสมาชิกแบบคงที่ซึ่งไม่เคยเปลี่ยนแปลงอินพุตใด ๆ
prabhakaran

11
จากนั้นอินพุตของคุณ (พารามิเตอร์ฟังก์ชัน) ควรเป็นตามค่าหรือการอ้างอิง const
GManNickG

4
มันไม่ส่งผลกระทบต่อความมั่นคงของอาร์กิวเมนต์ของฟังก์ชันสมาชิกอยู่ดี ไม่ได้หมายความว่า "make everything const" แต่หมายถึง "make this const"
UncleBens

@GMan คุณกำลังบอกว่าต้องเพิ่ม const ในอาร์กิวเมนต์
prabhakaran

คำตอบ:


139

เมื่อคุณใช้constqualifier กับฟังก์ชัน nonstatic member จะมีผลต่อthisตัวชี้ สำหรับฟังก์ชั่นสมาชิก const ที่มีคุณสมบัติของชั้นCที่thisชี้เป็นชนิดC const*, ในขณะที่สำหรับฟังก์ชันสมาชิกที่ไม่ได้ผ่านการรับรอง const ที่ชี้เป็นประเภทthisC*

ฟังก์ชันสมาชิกคงที่ไม่มีthisตัวชี้ (ฟังก์ชันดังกล่าวไม่ได้ถูกเรียกใช้ในอินสแตนซ์เฉพาะของคลาส) ดังนั้นคุณสมบัติ const ของฟังก์ชันสมาชิกคงที่จึงไม่สมเหตุสมผล


หมายความว่า 'const' มีไว้สำหรับตัวแปรเช่น int, pointer เป็นต้นเท่านั้น?
prabhakaran

@prabhakaran - ฟังก์ชั่นสมาชิกสามารถconstคุณสมบัติเกินไป ยากอบพูดอย่างชัดเจนในคำตอบของเขา
Mahesh

@Mahesh คุณสมบัติ const ของฟังก์ชันสมาชิกยังมีคุณสมบัติเฉพาะ 'ตัวชี้นี้' ไม่ใช่ทั้งหมด คุณยังคงสามารถเปลี่ยนตัวแปรส่วนกลางได้ภายในฟังก์ชันสมาชิกที่ผ่านการรับรอง const ตอนนี้มีเพียงฉันตรวจสอบสิ่งนี้
prabhakaran

5
-1 "ฟังก์ชันสมาชิกคงที่ไม่มีตัวชี้นี้ ... ดังนั้นคุณสมบัติ const ของฟังก์ชันสมาชิกคงที่จึงไม่สมเหตุสมผล [วิธีนั้น]" เป็นจริงในตัวมันเอง แต่ไม่ถูกต้องเนื่องจากเป็นผู้ตอบคำถาม "why ". ในฐานะที่เป็นคำตอบสันนิษฐานว่าความหมายของconstจะต้องเหมือนกันสำหรับสมาชิกแบบคงที่สำหรับสมาชิกที่ไม่คงที่ เป็นตัวอย่างที่ความคิดนั้นไม่ได้ถือเอาไว้ให้พิจารณาความหมายstaticซึ่งขึ้นอยู่กับบริบท
ไชโยและ hth - Alf

2
มันC const*หรือconst C*?
Crisron

24

ฉันเห็นด้วยกับคำถามของคุณ แต่น่าเสียดายที่ C ++ ได้รับการออกแบบมาเช่นนั้น ตัวอย่างเช่น:

class A {
  int i;         //<--- accessed with 'this'
  static int s;  //<---- accessed without 'this'
public:
  static void foo ()  const // <-- imaginary const
  {}
};

ณ วันนี้ที่มีการพิจารณาในบริบทของconst thisทางหนึ่งมันแคบ สามารถทำให้กว้างขึ้นได้โดยใช้สิ่งนี้constนอกเหนือจากthisตัวชี้
กล่าวคือ "เสนอ" constซึ่งอาจนำไปใช้กับstaticฟังก์ชันได้เช่นกันจะ จำกัดstaticสมาชิกจากการแก้ไขใด ๆ

ในโค้ดตัวอย่างหากfoo()สามารถสร้างได้constดังนั้นในฟังก์ชันนั้นA::sจะไม่สามารถแก้ไขได้ ฉันไม่เห็นผลข้างเคียงของภาษาใด ๆ หากเพิ่มกฎนี้ในมาตรฐาน ตรงกันข้ามกลับน่าขบขันที่เหตุใดจึงไม่มีกฎดังกล่าว!


8
อาจจะเหมือนกับเหตุผลที่คุณไม่สามารถปรับเปลี่ยนฟังก์ชันว่างให้เป็น "ฟังก์ชันนี้ไม่ได้แก้ไขตัวแปรส่วนกลางใด ๆ " constใช้กับออบเจ็กต์ (ในกรณีของฟังก์ชันสมาชิก const อินสแตนซ์ที่เรียกใช้) คุณต้องการให้มันใช้กับสมาชิกคงที่ทั้งหมดของชั้นเรียนฉันเดาว่าถ้าคณะกรรมการพิจารณาทั้งหมดแล้วก็ไม่คิดว่าจะเป็นข้อกำหนดทั่วไปเพียงพอที่จะสนับสนุน
Steve Jessop

1
constปรับปรุงไม่ได้นำไปใช้กับวิธีการสมาชิกหรือตัวแปรสมาชิก แต่นัยthis-pointer ตั้งแต่วิธีการที่สมาชิกคงไม่ผูกพันไปยังวัตถุที่ไม่มีthis-pointer constที่จะทำให้
Ruud Althuizen

0

โดยไม่ต้องลงรายละเอียดเป็นเพราะอาจมีหรือไม่มีวัตถุที่แก้ไขโดยฟังก์ชันดังนั้น const จึงคลุมเครือกับคอมไพเลอร์

การเรียกคืนที่constช่วยให้วัตถุคงที่ แต่อาจมีหรือไม่มีวัตถุอยู่ที่นี่เพื่อให้คงที่


2
"อาจหรือไม่ก็ได้"? ฟังก์ชันสมาชิกคงที่ไม่เคยมีthisตัวชี้ (นอกจากนี้constจะไม่ทำให้วัตถุคงที่เพราะป้องกันไม่ให้ใช้ตัวชี้หรือการอ้างอิงเฉพาะเพื่อแก้ไขวัตถุ แต่การแก้ไขอาจเกิดขึ้นในเส้นทางอื่น)
Ben Voigt

0

เป็นเรื่องน่าเสียดายที่ C ++ ไม่ยอมรับตามการออกแบบ แต่ในทางเหตุผลมีบางกรณีการใช้งานที่ตรวจสอบได้ดี

ฟังก์ชันที่เป็นระดับคลาสที่ถูกต้อง (คงที่) อาจไม่เปลี่ยนแปลงข้อมูลคงที่ใด ๆ อาจเป็นเพียงแค่การสืบค้นข้อมูลควรเป็น const อาจจะเป็นเช่นนั้น

if(Object)
    MakeThisConstant()
else
    MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios

0

'const member function' ไม่ได้รับอนุญาตให้แก้ไขอ็อบเจ็กต์ที่ถูกเรียกใช้ แต่ฟังก์ชัน static member จะไม่ถูกเรียกใช้กับอ็อบเจ็กต์ใด ๆ ถูกใช้โดยตรงโดยตัวดำเนินการแก้ไขขอบเขต ดังนั้นการมีฟังก์ชัน const static member จึงไม่สมเหตุสมผลดังนั้นจึงผิดกฎหมาย

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