วันนี้ฉันมีปัญหา ฉันต้องการstaticฟังก์ชั่นสมาชิกconstไม่ใช่สิ่งที่จำเป็น แต่เป็นสิ่งที่ดีกว่า แต่ฉันไม่ประสบความสำเร็จในความพยายามของฉัน ใครสามารถพูดได้ว่าทำไมหรืออย่างไร?
วันนี้ฉันมีปัญหา ฉันต้องการstaticฟังก์ชั่นสมาชิกconstไม่ใช่สิ่งที่จำเป็น แต่เป็นสิ่งที่ดีกว่า แต่ฉันไม่ประสบความสำเร็จในความพยายามของฉัน ใครสามารถพูดได้ว่าทำไมหรืออย่างไร?
คำตอบ:
เมื่อคุณใช้constqualifier กับฟังก์ชัน nonstatic member จะมีผลต่อthisตัวชี้ สำหรับฟังก์ชั่นสมาชิก const ที่มีคุณสมบัติของชั้นCที่thisชี้เป็นชนิดC const*, ในขณะที่สำหรับฟังก์ชันสมาชิกที่ไม่ได้ผ่านการรับรอง const ที่ชี้เป็นประเภทthisC*
ฟังก์ชันสมาชิกคงที่ไม่มีthisตัวชี้ (ฟังก์ชันดังกล่าวไม่ได้ถูกเรียกใช้ในอินสแตนซ์เฉพาะของคลาส) ดังนั้นคุณสมบัติ const ของฟังก์ชันสมาชิกคงที่จึงไม่สมเหตุสมผล
constจะต้องเหมือนกันสำหรับสมาชิกแบบคงที่สำหรับสมาชิกที่ไม่คงที่ เป็นตัวอย่างที่ความคิดนั้นไม่ได้ถือเอาไว้ให้พิจารณาความหมายstaticซึ่งขึ้นอยู่กับบริบท
C const*หรือconst C*?
ฉันเห็นด้วยกับคำถามของคุณ แต่น่าเสียดายที่ 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จะไม่สามารถแก้ไขได้ ฉันไม่เห็นผลข้างเคียงของภาษาใด ๆ หากเพิ่มกฎนี้ในมาตรฐาน ตรงกันข้ามกลับน่าขบขันที่เหตุใดจึงไม่มีกฎดังกล่าว!
constใช้กับออบเจ็กต์ (ในกรณีของฟังก์ชันสมาชิก const อินสแตนซ์ที่เรียกใช้) คุณต้องการให้มันใช้กับสมาชิกคงที่ทั้งหมดของชั้นเรียนฉันเดาว่าถ้าคณะกรรมการพิจารณาทั้งหมดแล้วก็ไม่คิดว่าจะเป็นข้อกำหนดทั่วไปเพียงพอที่จะสนับสนุน
constปรับปรุงไม่ได้นำไปใช้กับวิธีการสมาชิกหรือตัวแปรสมาชิก แต่นัยthis-pointer ตั้งแต่วิธีการที่สมาชิกคงไม่ผูกพันไปยังวัตถุที่ไม่มีthis-pointer constที่จะทำให้
โดยไม่ต้องลงรายละเอียดเป็นเพราะอาจมีหรือไม่มีวัตถุที่แก้ไขโดยฟังก์ชันดังนั้น const จึงคลุมเครือกับคอมไพเลอร์
การเรียกคืนที่constช่วยให้วัตถุคงที่ แต่อาจมีหรือไม่มีวัตถุอยู่ที่นี่เพื่อให้คงที่
thisตัวชี้ (นอกจากนี้constจะไม่ทำให้วัตถุคงที่เพราะป้องกันไม่ให้ใช้ตัวชี้หรือการอ้างอิงเฉพาะเพื่อแก้ไขวัตถุ แต่การแก้ไขอาจเกิดขึ้นในเส้นทางอื่น)
เป็นเรื่องน่าเสียดายที่ 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
'const member function' ไม่ได้รับอนุญาตให้แก้ไขอ็อบเจ็กต์ที่ถูกเรียกใช้ แต่ฟังก์ชัน static member จะไม่ถูกเรียกใช้กับอ็อบเจ็กต์ใด ๆ ถูกใช้โดยตรงโดยตัวดำเนินการแก้ไขขอบเขต ดังนั้นการมีฟังก์ชัน const static member จึงไม่สมเหตุสมผลดังนั้นจึงผิดกฎหมาย
constฟังก์ชันสมาชิกแบบคงที่มีความหมายกับคุณอย่างไร?