Giao diện
Chương 0
Học và thi môn này thế nào
Chương này không dạy C++. Nó trả lời một câu hỏi mà phần lớn sinh viên chỉ hiểu ra sau khi đã thi xong: bài thi thực hành đo cái gì, và vì sao nhiều bạn thấy lý thuyết rất ổn nhưng vào phòng thi lại không xong bài.
0.1 Một sự thật nên biết trước
Ba lớp gần nhất của môn này có kết quả như sau:
| Thành phần đánh giá | Điểm trung bình | Số SV dưới 5 |
|---|---|---|
| Chuyên cần | 9.3 – 9.4 | 1 / 147 |
| Bài tập | 8.0 – 8.9 | 12 / 147 |
| Đồ án, thi cuối kỳ lý thuyết | 8.0 – 8.3 | 0 / 147 |
| Thi thực hành trên máy | 4.8 – 6.6 | 65 / 147 |
Mọi thành phần đều 8 – 9 điểm, riêng bài thi trên máy tụt xuống quanh mốc 5. Và điểm bài tập hằng tuần gần như không dự báo được điểm thi thực hành — hệ số tương quan chỉ 0.37.
Điều đó nghĩa là gì
Làm được bài tập về nhà không chứng minh bạn sẽ làm được bài thi. Hai việc đó dùng hai kỹ năng khác nhau: đọc hiểu một lời giải đúng là một chuyện, tự viết ra nó trong 60 phút không có ai giúp là chuyện khác hẳn.
Cảm giác “mình hiểu rồi” khi đọc code của thầy là thật — nhưng nó là cảm giác nhận ra, không phải khả năng tạo ra. Chỉ có một cách phân biệt: đóng tài liệu lại và tự gõ.
0.2 Đề thi đo cái gì — nhìn vào thang điểm
Dưới đây là tổng hợp thang điểm của 12 đề thi thực hành gần nhất (hai học kỳ, hai ngành). Con số ở cột giữa là số đề có mục đó:
| Mục chấm | Có ở | Điểm |
|---|---|---|
| Chia file rõ ràng (.h, .cpp, main.cpp, đúng tên) | 12/12 | 2 |
| Chương trình chạy đúng, test case hợp lý | 12/12 | 2 – 3 |
| Thiết kế đúng lớp, kế thừa đầy đủ | 12/12 | 2 |
| Dùng đúng hàm ảo và override, đa hình qua con trỏ | 12/12 | 1 – 2 |
| UML / comment rõ ràng | 12/12 | +2 thưởng |
| Bắt và xử lý đúng ngoại lệ | 8/12 | 1 |
| Tính trừu tượng | 4/12 | 1 |
| Tính đóng gói (private/protected + getter/setter) | 4/12 | 1 |
| Hàm khởi tạo đúng | 4/12 | 1 |
Đọc kỹ hai dòng đầu.
Năm trên mười điểm không phải là hiểu OOP
Chia file (2 điểm) là: tạo đủ file, đặt đúng tên, viết đúng #ifndef, để khai báo trong .h và cài đặt trong .cpp.
Chạy đúng (3 điểm) là: biên dịch không lỗi, chạy không treo, in ra đúng từng dòng như đề yêu cầu.
Cả hai đều là thao tác, không phải tư duy. Ai luyện thì làm trong 10 phút, ai không luyện thì mất 40 phút và hết giờ trước khi kịp nghĩ tới thiết kế lớp. Đây là lý do thường gặp nhất của điểm 4 – 5.
Và 2 điểm thưởng UML chỉ đòi vẽ một sơ đồ hộp — không cần viết dòng code nào. Bỏ trống 2 điểm này trong khi trung bình lớp là 4.8 là một quyết định rất đắt.
0.3 Hình dạng một đề thi thực hành
Mười hai đề gần nhất đều cùng một khuôn. Thời gian 60 phút. Nội dung:
- Một đề bài mô tả 3–6 lớp bằng lời: lớp nào có thuộc tính gì, kế thừa ai, phương thức nào là thuần ảo.
- Yêu cầu trong
main(): tạo mộtvectorhoặc mảng con trỏ lớp cha, thêm vài đối tượng lớp con, gọi một phương thức qua con trỏ đó. - Một khối “Kết quả kỳ vọng” in sẵn output từng dòng — đây vừa là yêu cầu vừa là bộ test để bạn tự kiểm tra.
- Thang điểm in ngay trên đề. Bạn biết trước mình bị chấm bằng gì.
- Nén bài thành
<MSSV>_<Ho ten khong dau>.zipđặt vàoC:\OOP.
Nói cách khác: đề thi không có bất ngờ. Nó không hỏi thuật toán, không hỏi mẹo, không hỏi phần bạn chưa học. Nó yêu cầu đúng một việc — dựng một cây kế thừa nhỏ và cho nó chạy — và yêu cầu việc đó trong 60 phút, một mình.
0.4 Vì sao lý thuyết ổn mà vẫn không xong bài
Bốn nguyên nhân, theo thứ tự thường gặp:
1. Hết giờ vì thao tác chậm. Tạo 10 file, gõ header guard, gõ constructor, chạy g++, đọc lỗi liên kết. Nếu chưa thành phản xạ, riêng phần này đã ăn 40 trong 60 phút.
2. Không đọc được thông báo lỗi. Lỗi đầu tiên của g++ thường nói đúng chỗ sai, nhưng nếu chưa quen đọc thì sinh viên sửa mò và hỏng thêm.
3. Chỉ nhớ hình dạng, không nhớ cách viết. Nhìn code có virtual thì hiểu ngay, nhưng tự gõ từ trang trắng thì không nhớ đặt virtual ở lớp nào, override ở lớp nào.
4. Bỏ trống phần dễ. Không vẽ UML (mất 2 điểm thưởng), đặt sai tên file (mất tới 2 điểm), quên virtual ở destructor.
Cả bốn đều không chữa được bằng cách đọc thêm lý thuyết. Chúng chỉ chữa được bằng cách gõ.
0.5 Cách dùng giáo trình này
Sách được chia theo đúng tỉ trọng của thang điểm, không theo thứ tự truyền thống của một sách C++:
| Chương | Nội dung | Điểm liên quan trong đề thi |
|---|---|---|
| 1 | Công cụ, chia file, đọc lỗi biên dịch | 2 (chia file) + phần lớn 3 (chạy đúng) |
| 2 | Lớp, đối tượng, UML | 2 (thiết kế lớp) + 2 thưởng (UML) |
| 3 | Tính đóng gói | 1 |
| 4 | Tính kế thừa | 2 (thiết kế, kế thừa) |
| 5 | Tính đa hình | 1 – 2 |
| 6 | Tính trừu tượng và giao diện | 1 |
| 7 | Xử lý ngoại lệ | 1 |
| 8 | Giải trọn một đề thi thật | toàn bộ |
| 9 | Luyện dịch UML thành chương trình — 6 bài bấm giờ | toàn bộ |
Mỗi chương mở đầu bằng khung “Chương này ăn điểm ở đâu trong đề thi” và kết thúc bằng phần “Tự kiểm tra” — một bài bạn phải gõ từ trang trắng, có bấm giờ.
Ba quy tắc, nếu chỉ nhớ được ba điều
Ba quy tắc
1. Gõ trước, đọc sau. Không mở đáp án khi chưa tự viết được ít nhất phần khai báo lớp. Đọc một lời giải đúng trước khi tự vật lộn là cách chắc chắn nhất để tưởng mình hiểu.
2. Gõ, đừng chép. Chép–dán không luyện được ngón tay và không luyện được trí nhớ. Trong phòng thi bạn gõ, nên lúc học cũng phải gõ.
3. Đọc lỗi đầu tiên, không đọc lỗi cuối cùng. Một lỗi cú pháp sinh ra hàng chục dòng thông báo. Chỉ lỗi đầu tiên là thật, sửa nó rồi biên dịch lại.
Hệ thống chạy xuyên suốt sách: thư viện
Mọi ví dụ trong sách đều xoay quanh một hệ thống mượn trả thư viện, lớn dần qua từng chương: chương 2 có lớp Document với ba thuộc tính, tới chương 7 nó thành một hệ thống có bốn loại tài liệu, phiếu mượn, hạn trả và xử lý lỗi.
Làm vậy để bạn trải nghiệm được điều quan trọng nhất của lập trình hướng đối tượng, thứ không giảng được bằng slide: mở rộng một hệ thống đang chạy mà không phá nó. Ở chương 6 bạn sẽ mở lại file mình viết ở chương 3 — nếu chương 3 thiết kế tốt thì chương 6 thêm một lớp mới không phải sửa gì, còn nếu thiết kế dở thì bạn sẽ phải trả giá. Đó là bài học đắt và đáng.
0.6 Bạn đã học gì ở tám tuần lý thuyết
Sách này không dạy lại từ đầu. Nó đứng trên bộ slide lý thuyết bạn đã học. Bảng dưới đây cho biết mỗi chương của sách dựa vào tuần lý thuyết nào — nếu một chương thấy khó, hãy mở lại đúng tuần đó trước.
| Tuần lý thuyết | Bạn đã học | Sách dùng ở |
|---|---|---|
| 1 | Giới thiệu OOP, procedural vs hướng đối tượng, tam giác P.I.E, mục tiêu OOP | Chương 0, 6 |
| 2 | Hello world, tool-chain, ba loại lỗi (syntax / runtime / logic), các lỗi thường gặp | Chương 1 |
| 3 | Hàm: prototype, nạp chồng, tham số mặc định, phạm vi biến, tham chiếu và truyền tham chiếu | Chương 1, 2 |
| 4 | Lớp và đối tượng, sơ đồ UML, constructor, danh sách khởi tạo, tách .h / .cpp, mảng đối tượng | Chương 1, 2 |
| 5 | Đóng gói, getter/setter, public/protected/private, this, thành viên static | Chương 3 |
| 6 | Kế thừa, is-a, thứ tự constructor, truyền tham số cho lớp cha, redefining, friend | Chương 4 |
| 7 | Đa hình, liên kết tĩnh và liên kết động, virtual, thuần ảo, destructor ảo, slicing | Chương 5 |
| 8 | Lớp trừu tượng; ngoại lệ: throw/try/catch, thứ tự nhánh catch, what(), ném lại | Chương 6, 7 |
| (phụ) | Bộ slide Pointer: con trỏ, mảng và con trỏ, truyền con trỏ vào hàm | Chương 3, 5 |
Ba chỗ sách phải dạy thêm vì bài giảng chưa phủ
Đọc kỹ mục này — nó giải thích một phần điểm 4.8
1. Cấp phát động new / delete. Không có trong bất kỳ slide lý thuyết nào (tuần 7 chỉ nhắc chữ “delete operator” khi nói về destructor ảo). Nhưng mọi đề thi đều dùng — new Car(...) rồi bỏ vào danh sách. Sách dạy ở mục 3.5.
2. std::vector. Xuất hiện 0 lần trong tám tuần slide. Nhưng đề thi ghi rõ “Tạo vector chứa Vehicle*”. Sách dạy ở mục 5.4.
3. Lỗi liên kết. Bài giảng tuần 2 chia lỗi thành ba loại: cú pháp, lúc chạy, logic. Loại thứ tư — lỗi liên kết — chỉ xuất hiện khi bạn bắt đầu tách nhiều file, tức là từ tuần 4 trở đi. Sách dạy ở mục 1.6.
Nếu bạn từng thấy hụt hẫng khi vào phòng thi, rất có thể ba chỗ này là lý do: chúng bị đòi hỏi nhưng chưa từng được giảng.
Đã học ở bài giảng nhưng sách không dùng tới
Để bạn khỏi thắc mắc vì sao chúng vắng mặt: thành viên static (tuần 5), friend class (tuần 6), kế thừa lai (hybrid) và kế thừa phân cấp (tuần 6), tiền/hậu điều kiện (tuần 5), bảo đảm an toàn ngoại lệ (tuần 8). Không mục nào trong số đó có mặt trong thang điểm của 12 đề thi gần nhất. Chúng vẫn đáng biết — chỉ là không phải thứ nên luyện trước ngày thi.
Một ngoại lệ: friend có được dùng đúng một lần trong sách, ở mục 5.6, để viết operator<<. Đó là ứng dụng thực tế phổ biến nhất của từ khoá này.
Lưu ý về AI
Các công cụ AI viết được toàn bộ những bài trong sách này trong vài giây. Không ai cấm bạn dùng chúng để học — hỏi lại một khái niệm, nhờ giải thích một thông báo lỗi, nhờ chỉ ra chỗ sai trong code bạn đã tự viết — đó là cách dùng tốt.
Nhưng hãy nhìn lại bảng ở mục 0.1: trung bình thi thực hành là 4.8. AI không vào phòng thi cùng bạn. Nhờ nó làm hộ bài tập thì bạn vẫn nộp được bài, vẫn có điểm quá trình 9–10, và vẫn không qua nổi bài thi chiếm một nửa điểm môn.
Điểm của môn này đến từ những gì bạn làm được khi không có nó.