Xem xét biến thể của lớp học A
.
class A {
public:
void Foo() const;
void Moo();
private:
int m_nState; // Could add mutable keyword if desired
int GetState() const { return m_nState; }
void SetState(int val) { m_nState = val; }
};
const A *A1 = new A();
A *A2 = new A();
A1->Foo(); // OK
A2->Foo(); // OK
A1->Moo(); // Error - Not allowed to call non-const function on const object instance
A2->Moo(); // OK
Từ khóa const
trên khai báo hàm chỉ để trình biên dịch rằng chức năng là hợp đồng có nghĩa vụ không thay đổi tình trạng A
. Do đó, bạn không thể gọi các chức năng không phải là const
trong phạm vi A::Foo
cũng như không thay đổi giá trị của các biến thành viên.
Để minh họa, Foo() không thể viện dẫn A::SetState
vì nó được khai báo không const
, A::GetState
tuy nhiên là ok bởi vì nó được khai báo rõ ràng const
. Thành viên m_nState
không được thay đổi trừ khi được khai báo với từ khóa mutable
.
Một ví dụ về cách sử dụng này là const
là dành cho các hàm 'getter' để lấy giá trị của các biến thành viên.
@ 1800 Thông tin: Tôi quên mất khả năng thay đổi!
Từ khóa mutable
chỉ thị trình biên dịch chấp nhận sửa đổi đối với biến thành viên mà nếu không sẽ gây ra lỗi trình biên dịch. Nó được sử dụng khi hàm cần sửa đổi trạng thái nhưng đối tượng được xem là phù hợp lôgic (hằng số) bất kể sửa đổi.
Câu trả lời hay - thực sự rõ ràng và ngắn gọn. Có +1 của tôi –