### Giới thiệu C/C++ - **C++** là một ngôn ngữ lập trình đa năng, được phát triển từ ngôn ngữ C, hỗ trợ lập trình hướng đối tượng, lập trình tổng quát và lập trình thủ tục. - **Tính năng nổi bật:** Hiệu suất cao, quản lý bộ nhớ cấp thấp, tương thích ngược với C, hỗ trợ OOP. - **Ứng dụng:** Phát triển hệ điều hành, game, phần mềm nhúng, ứng dụng hiệu năng cao. ### Các thành phần cơ bản - **Cấu trúc chương trình:** ```cpp #include // Thư viện vào/ra int main() { // Hàm chính, điểm bắt đầu chương trình // Các câu lệnh std::cout ### Biểu thức và Toán tử - **Biểu thức:** Kết hợp các biến, hằng số, toán tử để tạo ra một giá trị. - **Toán tử số học:** `+`, `-`, `*`, `/`, `%` (chia lấy dư). - **Toán tử quan hệ:** `==`, `!=`, ` `, ` =` (trả về `true`/`false`). - **Toán tử logic:** `&&` (AND), `||` (OR), `!` (NOT). - **Toán tử gán:** `=`, `+=`, `-=`, `*=`, `/=`, `%=`. - **Toán tử tăng/giảm:** `++` (tăng 1), `--` (giảm 1) (tiền tố/hậu tố). ### Cấu trúc rẽ nhánh - **`if-else if-else`:** Thực thi các khối mã khác nhau dựa trên điều kiện. ```cpp if (condition1) { // code nếu condition1 đúng } else if (condition2) { // code nếu condition1 sai và condition2 đúng } else { // code nếu cả hai điều kiện đều sai } ``` - **`switch-case`:** Chọn một trong nhiều khối mã để thực thi dựa trên giá trị của một biến. ```cpp switch (expression) { case value1: // code break; case value2: // code break; default: // code nếu không khớp case nào } ``` ### Các vòng lặp - **`for` loop:** Lặp lại một khối mã một số lần xác định. ```cpp for (khoi_tao; dieu_kien; cap_nhat) { // code } // Ví dụ: for (int i = 0; i ### Mảng - **Mảng (Array):** Tập hợp các phần tử cùng kiểu dữ liệu, được lưu trữ liên tục trong bộ nhớ. - **Khai báo:** `kiểu_dữ_liệu tên_mảng[kích_thước];` - Ví dụ: `int numbers[5];` - **Khởi tạo:** ```cpp int numbers[5] = {10, 20, 30, 40, 50}; int moreNumbers[] = {1, 2, 3}; // Kích thước tự động xác định ``` - **Truy cập phần tử:** Sử dụng chỉ số (bắt đầu từ 0). - Ví dụ: `numbers[0]` là 10, `numbers[4]` là 50. - **Mảng đa chiều:** `int matrix[3][3];` ### Con trỏ - **Con trỏ (Pointer):** Biến lưu trữ địa chỉ bộ nhớ của biến khác. - **Khai báo:** `kiểu_dữ_liệu *tên_con_trỏ;` (ví dụ: `int *ptr;`) - **Toán tử địa chỉ (`&`):** Lấy địa chỉ của biến (ví dụ: `ptr = &var;`). - **Toán tử dereference (`*`):** Truy cập giá trị tại địa chỉ con trỏ trỏ tới (ví dụ: `*ptr`). - **Con trỏ và mảng:** Tên mảng là con trỏ tới phần tử đầu tiên (`arr` tương đương `&arr[0]`). - **Cấp phát bộ nhớ động:** - `new`: Cấp phát bộ nhớ (`int *p = new int;`). - `delete`: Giải phóng bộ nhớ (`delete p;`). - `new[]`: Cấp phát mảng động (`int *arr = new int[10];`). - `delete[]`: Giải phóng mảng động (`delete[] arr;`). ### Hàm - **Hàm (Function):** Khối mã thực hiện một nhiệm vụ cụ thể, có thể tái sử dụng. - **Khai báo (Prototype):** `kiểu_trả_về tên_hàm(kiểu_tham_số_1, kiểu_tham_số_2, ...);` - **Định nghĩa:** ```cpp kiểu_trả_về tên_hàm(kiểu_tham_số_1 tham_số_1, ...) { // code return giá_trị; // Nếu kiểu_trả_về không phải void } ``` - **Truyền tham số:** - **Truyền theo giá trị (Pass by Value):** Hàm nhận một bản sao của giá trị, không ảnh hưởng đến biến gốc. - **Truyền theo tham chiếu (Pass by Reference):** Hàm nhận địa chỉ của biến (dùng con trỏ hoặc tham chiếu `&`), có thể thay đổi biến gốc. ```cpp void increment(int &num) { // Tham chiếu num++; } void incrementPtr(int *num) { // Con trỏ (*num)++; } ``` ### Kiểu có cấu trúc (Structs) - **Struct:** Tập hợp các biến (thành viên) có thể có kiểu dữ liệu khác nhau, được nhóm lại dưới một tên. - **Khai báo:** ```cpp struct TênStruct { kiểu_dữ_liệu thành_viên_1; kiểu_dữ_liệu thành_viên_2; // ... }; ``` - **Tạo đối tượng và truy cập thành viên:** ```cpp TênStruct obj; obj.thành_viên_1 = giá_trị; // Toán tử dấu chấm (.) TênStruct *ptr_obj = &obj; ptr_obj->thành_viên_2 = giá_trị; // Toán tử mũi tên (->) cho con trỏ ``` ### Hướng đối tượng (OOP) - **OOP:** Phương pháp lập trình dựa trên các khái niệm "đối tượng", bao gồm dữ liệu và các phương thức thao tác dữ liệu đó. - **Các khái niệm chính:** - **Class:** Bản thiết kế (blueprint) cho các đối tượng. ```cpp class MyClass { public: // Phạm vi truy cập int data; void method() { /* ... */ } }; ``` - **Object:** Một thể hiện (instance) của class. (ví dụ: `MyClass obj;`) - **Encapsulation (Đóng gói):** Gói dữ liệu và phương thức vào một đơn vị (class), che giấu chi tiết bên trong. - **Inheritance (Kế thừa):** Cho phép một class (lớp con) kế thừa các thuộc tính và phương thức từ class khác (lớp cha). - **Polymorphism (Đa hình):** Khả năng một đối tượng có thể mang nhiều hình thái, thường thông qua hàm ảo (virtual functions) và ghi đè (overriding). - **Abstraction (Trừu tượng):** Chỉ hiển thị thông tin cần thiết và ẩn đi các chi tiết triển khai phức tạp. ### Xếp chồng toán tử (Operator Overloading) - Cho phép định nghĩa lại hành vi của toán tử (ví dụ: `+`, `-`, `==`) cho các kiểu dữ liệu do người dùng tự định nghĩa (class, struct). - **Cú pháp:** `kiểu_trả_về operator toán_tử (tham_số)` ```cpp class Vector { public: int x, y; Vector operator+(const Vector& other) { // Xếp chồng toán tử + Vector result; result.x = this->x + other.x; result.y = this->y + other.y; return result; } }; // Sử dụng: Vector v1, v2, v3; v3 = v1 + v2; ``` - Không thể xếp chồng tất cả các toán tử (ví dụ: `.`, `.*`, `::`, `sizeof`, `?:`). ### Kế thừa (Inheritance) - Cơ chế cho phép một class (lớp con/derived class) lấy các thuộc tính và phương thức từ một class khác (lớp cha/base class). - **Cú pháp:** `class LopCon : pham_vi_truy_cap LopCha { ... };` - `public`, `protected`, `private` là các phạm vi truy cập khi kế thừa. ```cpp class Animal { // Lớp cha public: void eat() { /* ... */ } }; class Dog : public Animal { // Lớp con kế thừa từ Animal public: void bark() { /* ... */ } }; // Dog có thể gọi eat() và bark() ``` - **Các loại kế thừa:** đơn, đa cấp, đa kế thừa (cần cẩn trọng với "diamond problem"), phân cấp. ### Bài tập tổng hợp - **Ví dụ cơ bản:** - Viết chương trình tính tổng, hiệu, tích, thương hai số. - Kiểm tra số nguyên tố, số chẵn/lẻ. - Đảo ngược chuỗi. - **Ví dụ nâng cao:** - Xây dựng lớp `PhanSo` với các phép toán cộng, trừ, nhân, chia (sử dụng xếp chồng toán tử). - Thiết kế hệ thống quản lý sinh viên sử dụng lớp, kế thừa. - Triển khai danh sách liên kết đơn sử dụng con trỏ và cấp phát động.