วันนี้ฉันมีปัญหา ฉันต้องการstatic
ฟังก์ชั่นสมาชิกconst
ไม่ใช่สิ่งที่จำเป็น แต่เป็นสิ่งที่ดีกว่า แต่ฉันไม่ประสบความสำเร็จในความพยายามของฉัน ใครสามารถพูดได้ว่าทำไมหรืออย่างไร?
วันนี้ฉันมีปัญหา ฉันต้องการstatic
ฟังก์ชั่นสมาชิกconst
ไม่ใช่สิ่งที่จำเป็น แต่เป็นสิ่งที่ดีกว่า แต่ฉันไม่ประสบความสำเร็จในความพยายามของฉัน ใครสามารถพูดได้ว่าทำไมหรืออย่างไร?
คำตอบ:
เมื่อคุณใช้const
qualifier กับฟังก์ชัน nonstatic member จะมีผลต่อthis
ตัวชี้ สำหรับฟังก์ชั่นสมาชิก const ที่มีคุณสมบัติของชั้นC
ที่this
ชี้เป็นชนิดC const*
, ในขณะที่สำหรับฟังก์ชันสมาชิกที่ไม่ได้ผ่านการรับรอง const ที่ชี้เป็นประเภทthis
C*
ฟังก์ชันสมาชิกคงที่ไม่มี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
ฟังก์ชันสมาชิกแบบคงที่มีความหมายกับคุณอย่างไร?