const correctness
const cho API cam kết object nào không bị thay đổi và giúp compiler chặn write ngoài ý muốn.
const correctness là gì?
const cho API cam kết object nào không bị thay đổi và giúp compiler chặn write ngoài ý muốn.
Diễn đạt dữ liệu chỉ đọc và pointer có thể thay đổi chính xác.
Điểm quan trọng
- Pointer chỉ được trỏ tới object còn sống, đúng type hoặc null.
- Mỗi vùng nhớ sở hữu chỉ được giải phóng đúng một lần.
- Thể hiện ownership và const rõ ràng trong API.
Code ví dụ bằng C và C++
main.c
#include <stdio.h>
int sum(const int *values, size_t count) {
int total = 0;
for (size_t i = 0; i < count; ++i) total += values[i];
return total;
}
int main(void) {
const int values[] = {2, 4, 6};
printf("%d\n", sum(values, 3));
return 0;
}
12
C++
main.cpp
#include <array>
#include <iostream>
int sum(const std::array<int, 3>& values) {
int total = 0;
for (int value : values) total += value;
return total;
}
int main() {
const std::array values{2, 4, 6};
std::cout << sum(values) << '\n';
}
12
So sánh C và C++
Pointer-to-const bảo vệ value; const pointer không được trỏ lại. C++ còn có const member function.
C
Ownership và cleanup là quy ước do lập trình viên tự bảo đảm.
C++
Container và RAII gắn ownership cùng cleanup vào lifetime của object.
Bài tập mở rộng
Chạy cả hai phiên bản rồi thay đổi để quan sát khác biệt về bảo đảm của từng ngôn ngữ.
- Test null và trường hợp cấp phát thất bại.
- Chạy AddressSanitizer và UndefinedBehaviorSanitizer.
- Ghi rõ pointer nào sở hữu và pointer nào chỉ quan sát.