Khi const đứng sau danh sách tham số của hàm thành viên (member function), nó đánh dấu hàm là hàm const (const member function) — cam kết không sửa đổi trạng thái đối tượng (non-mutable members).
Cú pháp
class MyClass {
int value;
public:
int getValue() const { // const ở cuối
// value = 10; // LỖI: không thể sửa member non-mutable
return value;
}
};
Ví dụ: Const member function
#include <iostream>
class MyClass {
int value;
public:
MyClass(int v = 0) : value(v) {}
// Const member function
int getValue() const {
// value = 10; // LỖI BIÊN DỊCH: assignment of member in read-only object
return value;
}
// Non-const member function
void setValue(int v) {
value = v; // OK
}
};
int main() {
const MyClass obj(80); // Const object
std::cout << "Gia tri: " << obj.getValue() << std::endl; // OK
// obj.setValue(100); // LỖI: không thể gọi non-const trên const object
}
Kết quả
Gia tri: 80
Quy tắc Const Correctness
| Loại đối tượng | Gọi const func | Gọi non-const func |
|---|---|---|
| Const object | ✅ OK | ❌ LỖI |
| Non-const object | ✅ OK | ✅ OK |
| Const reference/pointer | ✅ OK | ❌ LỖI |
Ví dụ: Lỗi khi gọi non-const trên const object
class MyClass {
int value;
public:
MyClass(int v) : value(v) {}
int getValue() { return value; } // THIẾU const!
};
int main() {
const MyClass obj(80);
std::cout << obj.getValue(); // LỖI: passing 'const MyClass' as 'this' discards qualifiers
}
Kết quả lỗi
[Error] passing 'const MyClass' as 'this' argument of 'int MyClass::getValue()' discards qualifiers
mutable: Ngoại lệ cho const
Thành viên đánh dấu mutable có thể sửa đổi trong const function:
class Cache {
mutable int hitCount = 0; // Có thể sửa trong const func
int data;
public:
int getData() const {
hitCount++; // OK: mutable
return data;
}
};
Const Overloading
Có thể nạp chồng hàm dựa trên const:
class Buffer {
char* data;
public:
// Non-const version: cho phép sửa
char& operator[](size_t i) { return data[i]; }
// Const version: chỉ đọc
const char& operator[](size_t i) const { return data[i]; }
};
int main() {
Buffer buf;
buf[0] = 'A'; // Gọi non-const version
const Buffer cbuf;
char c = cbuf[0]; // Gọi const version
}
Tóm tắt
constsau tham số = const member function- Cam kết: Không sửa non-mutable members
- Cho phép gọi trên const object
- Khuyến nghị: Mặc định dùng const cho getter, chỉ bỏ khi cần sửa
mutablecho cache, mutex, lazy init trong const context