Quay lại Khóa học
AI037 Undergraduate

C++ Primer, Bản thứ năm

Một hướng dẫn toàn diện và đáng tin cậy về C++, được viết lại hoàn toàn cho chuẩn C++11. Khóa học này bao quát mọi thứ từ các yếu tố cơ bản của ngôn ngữ đến các tiện ích thư viện phức tạp và các công cụ nâng cao trong việc xây dựng lớp.

5.0
57.0h
601 học viên
0 lượt thích
Trí tuệ nhân tạo
Bắt đầu học

Tổng quan khóa học

📚 Tóm tắt Nội dung

Hướng dẫn toàn diện và uy tín về C++, được viết lại hoàn toàn cho chuẩn C++11. Khóa học này bao quát mọi thứ từ các yếu tố cơ bản của ngôn ngữ đến các tiện ích thư viện phức tạp và các công cụ nâng cao để xây dựng lớp.

Tài liệu tiêu chuẩn ngành chính xác nhất để thành thạo lập trình C++ hiện đại theo chuẩn C++11.

Tác giả: Stanley B. Lippman, Josée Lajoie, Barbara E. Moo

Lời cảm ơn: Dave Abrahams, Andy Koenig, Stephan T. Lavavej, Jason Merrill, John Spicer, Herb Sutter, Bjarne Stroustrup, Alex Stepanov, cùng các thành viên trong ủy ban chuẩn hóa.

🎯 Mục tiêu Học tập

  1. Xác định và triển khai hàm main, đồng thời hiểu rõ cách tương tác với hệ điều hành.
  2. Thực hiện biên dịch qua dòng lệnh và quản lý các luồng I/O cơ bản (cin, cout).
  3. Áp dụng các câu lệnh điều khiển luồng để giải quyết các bài toán logic lặp, ví dụ như đếm số lần xuất hiện.
  4. Triển khai cấu trúc logic để đếm và xử lý các trường hợp liên tiếp của dữ liệu đầu vào.
  5. Phân biệt giữa toán tử gán (=) và toán tử so sánh bằng (==) trong các câu lệnh điều kiện.
  6. Sử dụng đối tượng lớp (Sales_item), truy cập các hàm thành viên thông qua toán tử dấu chấm, và bao gồm các tệp tiêu đề tùy chỉnh.
  7. Phân biệt các kiểu nguyên thủy khác nhau và dự đoán kết quả của các phép chuyển đổi kiểu và hiện tượng tràn số học không dấu.
  8. Triển khai các tính năng C++11 bao gồm khởi tạo danh sách, nullptr, constexpr, và các từ khóa suy diễn kiểu.
  9. Phân biệt giữa khai báo và định nghĩa biến, áp dụng quy tắc phạm vi để quản lý tính hiển thị của tên gọi.
  10. Phân biệt giữa tham chiếu và con trỏ, và sử dụng void* để xử lý bộ nhớ một cách tổng quát.

🔹 Bài học 1: Giới thiệu về C++ và Nhập/Xuất Cơ bản

Tổng quan: Bài học này giới thiệu cấu trúc nền tảng của một chương trình C++, tập trung vào hàm main, các kiểu dữ liệu cơ bản và quá trình biên dịch. Nó bao gồm các thao tác nhập/xuất (I/O) thiết yếu sử dụng thư viện iostream, triển khai logic thông qua vòng lặp whilefor, và kết thúc bằng giới thiệu các khái niệm hướng đối tượng thông qua lớp Sales_item.

Kết quả học tập:

  • Xác định và triển khai hàm main và hiểu rõ cách nó tương tác với hệ điều hành.
  • Thực hiện biên dịch qua dòng lệnh và quản lý các luồng I/O cơ bản (cin, cout).
  • Áp dụng các câu lệnh điều khiển luồng để giải quyết các bài toán logic lặp, ví dụ như đếm số lần xuất hiện.

🔹 Bài học 2: Điều khiển Luồng và Các Khái niệm Cơ bản về Lớp

Tổng quan: Bài học này chuyển từ điều khiển luồng cơ bản sang sức mạnh cốt lõi của C++: Lớp. Người học sẽ nắm vững logic cần thiết để xử lý luồng dữ liệu (đếm số lần xuất hiện liên tiếp) và học cách sử dụng lớp Sales_item để xử lý các cấu trúc dữ liệu phức tạp như thể chúng là kiểu dữ liệu tích hợp. Đơn vị kết thúc bằng việc triển khai một chương trình Kho sách hoạt động, tích hợp chuyển hướng tệp và báo cáo lỗi.

Kết quả học tập:

  • Triển khai cấu trúc logic để đếm và xử lý các trường hợp liên tiếp của dữ liệu đầu vào.
  • Phân biệt giữa toán tử gán (=) và toán tử so sánh bằng (==) trong các câu lệnh điều kiện.
  • Sử dụng đối tượng lớp (Sales_item), truy cập hàm thành viên qua toán tử dấu chấm, và bao gồm các tệp tiêu đề tùy chỉnh.

🔹 Bài học 3: Kiểu Nguyên thủy và Biến

Tổng quan: Bài học này thiết lập các khối xây dựng nền tảng của lập trình C++ bằng cách khám phá các kiểu số học, chu kỳ sống của biến, và mô hình bộ nhớ. Sinh viên sẽ thành thạo các chi tiết về chuyển đổi kiểu (đặc biệt là các kiểu không dấu), cú pháp khởi tạo danh sách C++11, và sự phân biệt then chốt giữa con trỏ và tham chiếu. Bài học kết thúc bằng hệ thống kiểu nâng cao bao gồm các chất lượng const, suy diễn kiểu (auto, decltype), và triển khai các cấu trúc dữ liệu tùy chỉnh bền vững bằng các rào chắn tiền xử lý.

Kết quả học tập:

  • Phân biệt giữa các kiểu nguyên thủy khác nhau và dự đoán kết quả của các phép chuyển đổi kiểu và hiện tượng tràn số học không dấu.
  • Triển khai các tính năng C++11 bao gồm khởi tạo danh sách, nullptr, constexpr, và các từ khóa suy diễn kiểu.
  • Phân biệt giữa khai báo và định nghĩa biến, đồng thời áp dụng quy tắc phạm vi để quản lý tính hiển thị của tên gọi.

🔹 Bài học 4: Kiểu Hợp và Chất lượng Kiểu Hiện đại

Tổng quan: Bài học này khám phá hệ thống kiểu phức tạp của C++11, tập trung vào cách các kiểu hợp (con trỏ và tham chiếu) tương tác với các chất lượng kiểu như constconstexpr. Sinh viên sẽ thành thạo các chi tiết về suy diễn kiểu sử dụng autodecltype, và học cách đóng gói dữ liệu bên trong các cấu trúc tùy chỉnh được bảo vệ bởi các rào chắn tiêu đề tiền xử lý.

Kết quả học tập:

  • Phân biệt giữa tham chiếu và con trỏ, đồng thời tận dụng void* để xử lý bộ nhớ một cách tổng quát.
  • Phân loại và áp dụng các chất lượng const cấp cao và cấp thấp, cũng như constexpr cho các hằng số thời điểm biên dịch.
  • Triển khai suy diễn kiểu C++11 (autodecltype) để viết mã nguồn linh hoạt và dễ bảo trì.

🔹 Bài học 5: Chuỗi và Vector Thư viện

Tổng quan: Bài học này đề cập đến các kiểu cơ bản trong thư viện chuẩn C++ là stringvector, cung cấp các lựa chọn linh hoạt và an toàn hơn so với kiểu dữ liệu tích hợp. Sinh viên sẽ học cách quản lý truy cập namespace thông qua khai báo using, khởi tạo và thao tác chuỗi có độ dài thay đổi và các container, và sử dụng vòng lặp for dựa trên phạm vi cùng các iterator để xử lý hiệu quả các tập hợp dữ liệu.

Kết quả học tập:

  • Đơn giản hóa mã nguồn bằng cách sử dụng khai báo namespace using trong khi tránh những sai lầm phổ biến trong tệp tiêu đề.
  • Thực hiện khởi tạo chuỗi và vector một cách vững chắc, bao gồm khởi tạo danh sách C++11.
  • Triển khai xử lý từng ký tự và mở rộng container động bằng push_back, vòng lặp for dựa trên phạm vi, và các thao tác iterator cơ bản.

🔹 Bài học 6: Iterator và Mảng Tích hợp

Tổng quan: Bài học này đề cập đến các cơ chế nền tảng để di chuyển và quản lý dãy trong C++11. Nó đi từ các công cụ hiện đại cấp cao như iterator cho stringvector đến các mảng tích hợp cấp thấp, toán tử con trỏ và chuỗi ký tự phong cách C. Sinh viên sẽ học cách giao tiếp với mã dùng mảng cũ kỹ với các container thư viện chuẩn hiện đại và quản lý các cấu trúc đa chiều phức tạp.

Kết quả học tập:

  • Sử dụng iterator và toán tử arithmetical của iterator để di chuyển và thao tác các container stringvector.
  • Định nghĩa, khởi tạo và di chuyển qua mảng tích hợp bằng toán tử con trỏ và các hàm thư viện begin/end.
  • Triển khai các thao tác chuỗi phong cách C và giao tiếp an toàn giữa mảng tích hợp với các kiểu thư viện hiện đại.

🔹 Bài học 7: Biểu thức, Toán tử và Chuyển đổi

Tổng quan: Bài học này đề cập đến các khối xây dựng nền tảng của biểu thức C++, tập trung vào cách ngôn ngữ đánh giá các thao tác và quản lý kiểu dữ liệu. Sinh viên sẽ thành thạo sự phân biệt giữa lvalue và rvalue, các quy tắc ưu tiên và tính liên kết của toán tử, và cơ chế thực hiện các thao tác số học, logic và bitwise. Ngoài ra, bài học còn đi sâu vào quản lý kiểu C++, bao gồm các chuyển đổi số học ngầm định và ứng dụng an toàn các phép chuyển đổi tường minh có tên.

Kết quả học tập:

  • Phân biệt giữa lvalue (tính duy nhất của đối tượng) và rvalue (giá trị của đối tượng) và hiểu vai trò của chúng trong biểu thức.
  • Dự đoán thứ tự đánh giá của biểu thức phức tạp bằng cách sử dụng ưu tiên, tính liên kết và logic ngắn mạch.
  • Thực hiện thao tác dữ liệu cấp thấp bằng các toán tử bitwise và quản lý an toàn kiểu dữ liệu thông qua chuyển đổi ngầm định và các phép chuyển đổi tường minh có tên.

🔹 Bài học 8: Câu lệnh Nâng cao và Xử lý Ngoại lệ

Tổng quan: Bài học này đề cập đến các cấu trúc điều khiển luồng C++ thiết yếu, từ các loại câu lệnh cơ bản và quy tắc phạm vi đến logic điều kiện và lặp nâng cao. Nó cũng giới thiệu các kỹ thuật xử lý lỗi đáng tin cậy bằng cơ chế xử lý ngoại lệ của C++ và hiệ thống ngoại lệ trong thư viện chuẩn.

Kết quả học tập:

  • Phân biệt giữa câu lệnh null, đơn giản và hợp thành, đồng thời quản lý phạm vi biến trong các cấu trúc này.
  • Triển khai ra quyết định phức tạp bằng các câu lệnh ifswitch trong khi khắc phục các lỗi logic như "dangling else".
  • Chọn và áp dụng cấu trúc lặp phù hợp (while, for, range for, do while) cho các nhiệm vụ lập trình cụ thể.

🔹 Bài học 9: Thiết kế Hàm và Truyền Tham số

Tổng quan: Bài học này đề cập đến kiến trúc hàm C++, tập trung vào cách dữ liệu được truyền vào và trả về từ các khối mã riêng biệt. Nó khám phá chu kỳ sống của đối tượng cục bộ, cơ chế truyền tham số (theo giá trị vs. theo tham chiếu), và chuẩn C++11 để xử lý các tham số khác nhau. Việc nắm vững các khái niệm này giúp lập trình viên viết mã hiệu quả, tái sử dụng được và an toàn về bộ nhớ.

Kết quả học tập:

  • Phân biệt các phương pháp khởi tạo tham số và ảnh hưởng của chúng đến hiệu suất và tính toàn vẹn dữ liệu.
  • Triển khai giao diện hàm vững chắc bằng cách sử dụng các chất lượng const, initializer_list, và kỹ thuật truyền mảng.
  • Quản lý thời gian tồn tại đối tượng một cách hiệu quả bằng cách sử dụng bộ nhớ tự động và tĩnh.

🔹 Bài học 10: Tính năng Nâng cao và Ghi đè Hàm

Tổng quan: Bài học này đề cập đến các cơ chế phức tạp của hàm C++, tập trung vào truyền tham số, thời gian sống đối tượng, và độ phức tạp của ghi đè hàm. Sinh viên sẽ thành thạo các tính năng C++11 như initializer_list cho tham số thay đổi, hàm constexpr, và khai báo và sử dụng con trỏ hàm để tạo ra mã nguồn linh hoạt và module.

Kết quả học tập:

  • Phân biệt giữa truyền theo giá trị và truyền theo tham chiếu, và xác định khi nào nên sử dụng tham số const.
  • Áp dụng quy tắc giải quyết ghi đè để xác định "phù hợp nhất" trong số các hàm khả thi.
  • Triển khai và quản lý con trỏ hàm, bao gồm việc sử dụng chúng trong các container như vector và làm kiểu trả về.

🔹 Bài học 11: Bao đóng Lớp và Hàm Tạo

Tổng quan: Bài học này đề cập đến bước chuyển từ các cấu trúc dữ liệu đơn giản sang Kiểu Dữ liệu Trừu tượng (ADT) trong C++. Nó tập trung vào cơ chế thiết kế lớp, bao gồm hàm thành viên, con trỏ this ngầm định, và vai trò then chốt của hàm tạo trong việc khởi tạo đối tượng. Ngoài ra, nó khám phá bao đóng thông qua kiểm soát truy cập (public/private) và sử dụng "bạn" để duy trì giao diện sạch trong khi che giấu chi tiết triển khai.

Kết quả học tập:

  • Thiết kế và triển khai một lớp C++ (như Sales_data) tách biệt giao diện khỏi triển khai.
  • Thành thạo quy tắc khởi tạo đối tượng bằng các hàm tạo mặc định, ghi đè và hàm tạo rõ ràng.
  • Áp dụng các chỉ thị truy cập và quyền thân mật để đảm bảo bao đóng và quản lý phạm vi lớp.

🔹 Bài học 12: Phạm vi Lớp và Quản lý Chuyển đổi

Tổng quan: Bài học này đề cập đến các cơ chế nâng cao trong thiết kế lớp C++, tập trung vào bước chuyển từ các cấu trúc dữ liệu đơn giản sang Kiểu Dữ liệu Trừu tượng (ADT) vững chắc. Các chủ đề chính bao gồm quản lý khởi tạo đối tượng qua nhiều loại hàm tạo, kiểm soát chuyển đổi kiểu ngầm bằng từ khóa explicit, và hiểu rõ các thực thể cấp lớp như thành phần static và lớp hằng số.

Kết quả học tập:

  • Thiết kế và triển khai các lớp bao đóng (ADT) bằng cách sử dụng chỉ thị truy cập và khai báo bạn.
  • Quản lý chuyển đổi kiểu ngầm của lớp và vô hiệu hóa chúng bằng từ khóa explicit.
  • Triển khai và khởi tạo thành phần static của lớp để quản lý dữ liệu chung cho toàn lớp.

🔹 Bài học 13: IO Luồng và Cơ bản về Container Tuần tự

Tổng quan: Bài học này đề cập đến cơ chế nền tảng của hệ thống IO thư viện chuẩn C++ và các container tuần tự. Sinh viên sẽ học cách quản lý trạng thái điều kiện luồng và bộ đệm đầu ra, thực hiện I/O trên tệp và chuỗi, và di chuyển qua các container thư viện. Bài học nhấn mạnh các khái niệm then chốt về phạm vi iterator, khởi tạo container, và hệ quả hiệu suất của quản lý bộ nhớ container.

Kết quả học tập:

  • Kiểm tra và khôi phục trạng thái điều kiện luồng, đồng thời kiểm soát việc xả bộ đệm đầu ra để quản lý tính toàn vẹn luồng.
  • Sử dụng fstreamsstream để xử lý dữ liệu bền vững và trong bộ nhớ với các chế độ tệp khác nhau.
  • Chọn container tuần tự phù hợp dựa trên mẫu truy cập và chi phí bộ nhớ để tối ưu hóa lựa chọn.

🔹 Bài học 14: Thao tác Container và Thuật toán Tổng quát

Tổng quan: Bài học này đề cập đến việc quản lý các container tuần tự C++ và ứng dụng các thuật toán tổng quát để xử lý dữ liệu độc lập với loại container. Nó khám phá cách các container xử lý tăng trưởng bộ nhớ và vòng đời phần tử, cùng với việc sử dụng lambda và binder hàm để tùy chỉnh các thuật toán thư viện. Sinh viên sẽ thành thạo kiến trúc thư viện, bao gồm các loại iterator và các thuật toán chuyên biệt.

Kết quả học tập:

  • Quản lý vòng đời container bằng các thao tác chuyên biệt cho forward_list, kỹ thuật điều chỉnh kích thước, và quản lý dung lượng vector.
  • Thực hiện thao tác chuỗi phức tạp và chuyển đổi số học bằng thư viện string mở rộng và các adaptor container.
  • Triển khai các thuật toán tổng quát để đọc, ghi và sắp xếp lại dữ liệu trong khi tùy chỉnh hành vi thông qua các điều kiện, biểu thức lambda và std::bind.

🔹 Bài học 15: Container Liên kết và Con trỏ Thông minh

Tổng quan: Bài học này đề cập đến chuẩn C++11 cho container liên kết và quản lý bộ nhớ động. Nó chi tiết hóa việc sử dụng container có thứ tự và không có thứ tự để truy xuất hiệu quả theo khóa, và triển khai mã nguồn vững chắc, an toàn ngoại lệ bằng cách sử dụng con trỏ thông minh. Bài học kết thúc bằng việc thiết kế một ứng dụng Text-Query thực tế tích hợp các cấu trúc dữ liệu phức tạp này.

Kết quả học tập:

  • Triển khai và thao tác container liên kết bằng các kỹ thuật tìm kiếm, chèn và truy cập nhanh theo chỉ số.
  • Thành thạo quản lý bộ nhớ động bằng cách chuyển từ new/delete thủ công sang con trỏ thông minh dựa trên RAII và lớp allocator.
  • Thiết kế các hệ thống phức tạp chia sẻ dữ liệu an toàn giữa các lớp bằng cách sử dụng đếm tham chiếu và quyền sở hữu con trỏ thông minh.

🔹 Bài học 16: Quản lý Tài nguyên và Ngữ nghĩa Di chuyển

Tổng quan: Bài học này khám phá cách các lớp C++ kiểm soát vòng đời tài nguyên của chúng thông qua "Năm hàm đặc biệt" (Big Five). Sinh viên sẽ học cách quản lý bộ nhớ động bằng chiến lược giống giá trị và giống con trỏ, triển khai idiom copy-and-swap an toàn ngoại lệ, và tối ưu hiệu suất bằng ngữ nghĩa di chuyển C++11 và tham chiếu rvalue.

Kết quả học tập:

  • Triển khai và giải thích Quy tắc Ba/Năm để đảm bảo quản lý tài nguyên đúng đắn và ngăn ngừa rò rỉ bộ nhớ.
  • Phân biệt giữa hành vi giống giá trị và giống con trỏ của lớp, đồng thời triển khai đếm tham chiếu.
  • Áp dụng ngữ nghĩa di chuyển bằng tham chiếu rvalue và std::move để loại bỏ các bản sao sâu không cần thiết của các đối tượng lớn.

🔹 Bài học 17: Ghi đè Toán tử và Kế thừa (Lập trình Hướng Đối tượng)

Tổng quan: Bài học này khám phá việc mở rộng cú pháp ngôn ngữ thông qua ghi đè toán tử và xây dựng các hệ thống mở rộng thông qua Lập trình Hướng Đối tượng (OOP). Sinh viên sẽ học cách thiết kế các lớp tích hợp với các thao tác tích hợp, đồng thời nắm vững cơ chế kế thừa, liên kết động và các cấu trúc cây lớp đa hình.

Kết quả học tập:

  • Thiết kế và triển khai các toán tử bị ghi đè tuân theo quy ước thư viện chuẩn C++.
  • Tạo và sử dụng các đối tượng hàm và bộ bọc kiểu function để thống nhất các thực thể có thể gọi.
  • Xây dựng các cấu trúc kế thừa vững chắc bằng các hàm ảo, lớp cơ sở trừu tượng và các chỉ thị truy cập C++11.

🔹 Bài học 18: Mẫu và Lập trình Tổng quát

Tổng quan: Bài học này đề cập đến các cơ chế cơ bản và nâng cao của mẫu C++, cung cấp nền tảng cho lập trình tổng quát. Sinh viên sẽ tiến từ việc định nghĩa các mẫu hàm và lớp cơ bản đến việc thành thạo các tính năng đặc thù C++11 như mẫu biến số, truyền hoàn hảo và chuyên biệt hóa mẫu.

Kết quả học tập:

  • Định nghĩa và khởi tạo mẫu hàm và lớp bằng cả tham số kiểu và không kiểu.
  • Quản lý mô hình biên dịch mẫu và kiểm soát khởi tạo qua nhiều tệp bằng extern template.
  • Triển khai các kỹ thuật suy luận nâng cao, bao gồm kiểu trả về đuôi và truyền hoàn hảo với std::forward.

🔹 Bài học 19: Công cụ Thư viện Đặc biệt và Hệ thống Lớn

Tổng quan: Bài học này đề cập đến các thành phần thư viện chuẩn C++11 nâng cao và các tính năng ngôn ngữ được thiết kế cho phát triển hệ thống phức tạp. Nó bao gồm các cấu trúc dữ liệu chuyên biệt, khớp mẫu mạnh mẽ thông qua thư viện regex, và các công cụ kiến trúc cho lập trình quy mô lớn. Ngoài ra, nó khám phá xử lý ngoại lệ nâng cao, quản lý namespace và độ phức tạp của kế thừa đa cấp.

Kết quả học tập:

  • Sử dụng tuple cho nhiều giá trị trả về và bitset để quản lý cờ mức bit một cách hiệu quả.
  • Triển khai khớp mẫu chuỗi phức tạp, xác thực và chuyển đổi bằng thư viện regex.
  • Tạo số ngẫu nhiên chất lượng cao bằng các máy sinh và phân phối trong khi duy trì trạng thái và seeding phù hợp.