1. Vấn đề nó giải quyết
Copy constructor tạo đối tượng mới từ đối tượng đã có và quyết định trạng thái sở hữu được sao chép an toàn như thế nào. Nó làm ràng buộc quan trọng hiện rõ thay vì bắt người đọc đoán. Bài chỉ giữ phần cốt lõi C++11 vừa đủ cho một ngày tập trung.
2. Kiến thức cần có
Kiến thức Ngày 13, cùng biến, hàm và cách đọc output đã học trước đó.
3. Ý tưởng cốt lõi
Mental model: Copy constructor tạo đối tượng mới từ đối tượng đã có và quyết định trạng thái sở hữu được sao chép an toàn như thế nào. Hãy xác định giá trị hoặc trạng thái liên quan, ai sở hữu nó và quy tắc tác động lúc compile hay lúc chạy.
4. Cú pháp tối thiểu
Box(const Box& other) : value_(other.value_) {}5. Cách nó hoạt động
Ví dụ tạo dữ liệu nhỏ, cố định và không cần nhập bàn phím.
C++11 hoặc contract thư viện chuẩn áp dụng quy tắc hôm nay.
Chương trình in kết quả quan trọng để đối chiếu với mã nguồn.
6. Lỗi thường gặp
Shallow copy một raw pointer sở hữu khiến hai đối tượng cùng xóa một vùng nhớ, dẫn tới undefined behavior.
7. Khi nào nên dùng
Nên dùng khi kiểu sở hữu trạng thái cần quy tắc nhân bản rõ ràng.
Tránh dùng khi nó che ownership, lifetime, kiểu, thứ tự hoặc chi phí.
8. Ví dụ đơn giản
Sao chép Box nhỏ gọi copy constructor; sửa bản sao cho thấy đối tượng gốc vẫn độc lập. File .cpp dùng dữ liệu cố định và không thêm abstraction ngoài chủ đề.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp11/14_copy_constructor/main.cpp
#include <iostream>
class Box {
public:
explicit Box(int value) : value_(value) {}
Box(const Box& other) : value_(other.value_) {
std::cout << "copied\n";
}
void set(int value) {
value_ = value;
}
int get() const {
return value_;
}
private:
int value_;
};
int main() {
Box original(7);
Box copy(original);
copy.set(9);
std::cout << "original=" << original.get() << " copy=" << copy.get() << '\n';
}
9. Điều cần nhớ
Tính năng nằm trong phạm vi C++11 của lộ trình này.
Hiểu hệ quả về lifetime, ownership, kiểu và thứ tự trước khi dùng.
Compile với cảnh báo và ưu tiên cách viết nhỏ nhất làm quy tắc hiện rõ.
10. Câu hỏi tự kiểm tra
Dễ — Copy constructor dùng để tạo đối tượng mới hay sửa đối tượng đã tồn tại? Giải thích khai báo
Box(const Box& other).Trung bình — Đọc ví dụ nhỏ ở trên. Chương trình sẽ in giá trị hoặc trạng thái nào, và quy tắc nào tạo ra kết quả đó?
Khó — Tìm và giải thích lỗi tinh tế trong tình huống sau: Shallow copy một raw pointer sở hữu khiến hai đối tượng cùng xóa một vùng nhớ, dẫn tới undefined behavior. Cách sửa nhỏ nhất nhưng an toàn trong C++11 là gì?