ฉันจะพูดกับ C ++ ซึ่งความแตกต่างนี้เกี่ยวข้องมากที่สุด
ในขณะที่คุณทราบอย่างถูกต้องไม่เปลี่ยนรูปหมายความว่าวัตถุไม่สามารถเปลี่ยนแปลงได้เลยหลังจากการสร้าง การสร้างนี้สามารถเกิดขึ้นได้ที่รันไทม์เช่นconst
วัตถุไม่จำเป็นต้องเป็นค่าคงที่เวลารวบรวม ใน C ++ วัตถุจะไม่เปลี่ยนรูปถ้า (1) และ (2) หรือ (3) เป็นไปตาม:
ไม่มีสมาชิกที่ประกาศmutable
ว่าจะกลายพันธุ์โดยconst
ฟังก์ชั่นสมาชิก
มันถูกประกาศ const
const
ฟังก์ชั่นสมาชิกไม่ได้ใช้const_cast
เพื่อลบconst
คุณสมบัติเพื่อที่จะกลายพันธุ์สมาชิกใด ๆ
อย่างไรก็ตามคุณยังสามารถพิจารณาตัวดัดแปลงการเข้าถึงได้: หากการดำเนินการกลายพันธุ์ภายใน แต่ไม่มีผลต่อสถานะของอินสแตนซ์ที่สังเกตได้ผ่านทางส่วนต่อประสานสาธารณะของมันวัตถุนั้นคือ "ไม่เปลี่ยนรูปแบบตรรกะ"
ดังนั้น C ++ จึงมีเครื่องมือที่จำเป็นในการสร้างออบเจ็กต์ที่ไม่เปลี่ยนรูปแบบ แต่ทุกอย่างส่วนใหญ่ใน C ++ นั้นเครื่องมือนั้นมีความเพียงพอเพียงเล็กน้อยเท่านั้นและต้องการความขยันในการใช้งานจริง สถานะของอินสแตนซ์ไม่จำเป็นต้อง จำกัด อยู่ที่ตัวแปรสมาชิกอินสแตนซ์เนื่องจาก C ++ ไม่ได้ให้วิธีการบังคับใช้ความโปร่งใสในการอ้างอิงจึงสามารถรวมสถานะโกลบอลหรือคลาสได้เช่นกัน
const
ยังมีฟังก์ชั่นอื่นใน C ++: เพื่อให้การอ้างอิงและพอยน์เตอร์ การconst
อ้างอิงอาจหมายถึงconst
วัตถุที่ไม่ใช่ มันเป็นเรื่องถูกกฎหมาย (แม้ว่าไม่จำเป็นโดยทั่วไปหรือแนะนำให้เลือก) เพื่อใช้const_cast
ในการกลายพันธุ์วัตถุผ่านการconst
อ้างอิงถ้าหากว่าวัตถุนั้นถูกประกาศว่าไม่ใช่const
:
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
และแน่นอนว่ามันเป็นพฤติกรรมที่ไม่ได้กำหนดไว้เพื่อกลายพันธุ์const
วัตถุ:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
const
ไม่มีอยู่ในทุกภาษาและความผันแปรและการเปลี่ยนแปลงไม่ได้ไม่มีอยู่ในทุกภาษาดังนั้นการใช้ภาษานี้จึงไม่สามารถใช้งานได้ เป็นภาษาเฉพาะที่ใช้กับแนวคิดเหล่านี้เท่านั้น