Được phát triển bởi Bjarne Stroustrup vào những năm 1980 như một sự mở rộng của C, C++ mang đến nhiều tính năng mạnh mẽ hơn, đặc biệt là khả năng lập trình hướng đối tượng. Điều này cho phép lập trình viên tạo ra các ứng dụng phức tạp và linh hoạt hơn, đồng thời vẫn duy trì được hiệu suất cao của C. Học lập trình C++ cơ bản và nâng cao sẽ mở ra cho bạn cơ hội làm việc với các hệ thống lớn hơn, quản lý bộ nhớ hiệu quả hơn, và viết mã dễ bảo trì hơn.
Bài viết “Lập trình C++ cơ bản” là phần 2 thuộc chuỗi bài viết về ngôn ngữ lập trình C và C++. Cụ thể:
- Phần 1: Lập trình C cơ bản với các cú pháp C cần biết
- Phần 2: Lập trình C++ cơ bản với các câu lệnh C++ cơ bản và nâng cao (bài viết hiện tại)
Review những điều đã học trong phần 1
Trong phần 1, chúng ta đã cùng nhau tìm hiểu những khái niệm cơ bản của ngôn ngữ lập trình C, bao gồm:
- Giới thiệu về ngôn ngữ lập trình C: Bạn đã được giới thiệu về lịch sử và tầm quan trọng của C, cũng như tại sao nó lại là nền tảng của nhiều ngôn ngữ lập trình hiện đại.
- Cú pháp cơ bản: Bạn đã học cách viết và chạy chương trình “Hello, World!”, cùng với các khái niệm cơ bản về biến và kiểu dữ liệu.
- Câu lệnh điều kiện: Chúng ta đã xem xét cách sử dụng các câu lệnh if, else if, else và switch để kiểm soát luồng chương trình.
- Vòng lặp: Bạn đã học cách sử dụng vòng lặp for, while và do-while để thực hiện các tác vụ lặp đi lặp lại.
- Mảng và Con trỏ: Chúng ta đã tìm hiểu cách khai báo và sử dụng mảng, cùng với giới thiệu về con trỏ và cách sử dụng chúng.
- Hàm: Bạn đã học cách định nghĩa và gọi hàm, cũng như làm việc với tham số hàm và phạm vi biến.
- Cấu trúc (struct) và Union: Bạn đã được giới thiệu về cấu trúc và cách sử dụng struct, cùng với giới thiệu về union.
- Làm việc với tệp tin: Chúng ta đã tìm hiểu cách mở và đóng tệp, đọc và ghi dữ liệu vào tệp.
- Quản lý bộ nhớ động: Bạn đã học cách cấp phát và giải phóng bộ nhớ động với malloc và free.
Bạn sẽ học được gì ở phần 2?
Trong phần 2 này, chúng ta sẽ mở rộng những kiến thức cơ bản đã học và khám phá các câu lệnh nâng cao trong C++, bao gồm:
- Lập trình hướng đối tượng (OOP): Tạo và sử dụng các lớp, đối tượng, kế thừa, và đa hình để thiết kế các hệ thống phần mềm linh hoạt và dễ bảo trì.
- Xử lý ngoại lệ: Sử dụng try, catch, và throw để xử lý lỗi và ngoại lệ trong chương trình, giúp mã nguồn rõ ràng và dễ bảo trì hơn.
- Mẫu Hàm và Lớp (Templates): Tạo các hàm và lớp tổng quát để sử dụng lại mã nguồn và làm việc với các kiểu dữ liệu khác nhau một cách linh hoạt.
- Thư viện chuẩn C++ (STL): Sử dụng các cấu trúc dữ liệu và thuật toán có sẵn trong STL để tăng tốc độ phát triển và hiệu quả của chương trình.
- Lập trình đa luồng: rất cần thiết cho những chương trình lớn để thực thi nhiều tác vụ cùng lúc.
Đọc thêm: OOP là gì? 4 đặc tính cơ bản của OOP
Lợi ích của việc học các câu lệnh lập trình C++ cơ bản
Học các câu lệnh trong C++ sẽ mang lại nhiều lợi ích cho lập trình viên:
- Viết mã mạnh mẽ hơn: Sử dụng các kỹ thuật lập trình hiện đại để tạo ra các ứng dụng phức tạp và hiệu quả.
- Tăng hiệu suất: Tối ưu hóa mã để chạy nhanh hơn và sử dụng tài nguyên hệ thống hiệu quả hơn.
- Quản lý bộ nhớ tốt hơn: Hiểu và áp dụng các kỹ thuật quản lý bộ nhớ động để tránh rò rỉ bộ nhớ và tăng hiệu suất ứng dụng.
- Lập trình hướng đối tượng: Xây dựng các hệ thống phần mềm linh hoạt và dễ bảo trì bằng cách sử dụng các đối tượng và lớp.
- Sử dụng lại mã nguồn: Tận dụng các mẫu hàm và lớp để tạo ra mã nguồn tổng quát và sử dụng lại trong nhiều dự án khác nhau.
Cú pháp lập trình C++ cơ bản: Câu lệnh Nhảy
Câu lệnh break
Dùng để thoát khỏi vòng lặp hoặc câu lệnh switch.
for (int i = 0; i < 10; ++i) { if (i == 5) break; std::cout << i << std::endl; }
Câu lệnh continue
Dùng để bỏ qua lần lặp hiện tại và chuyển sang lần lặp tiếp theo.
for (int i = 0; i < 10; ++i) { if (i == 5) continue; std::cout << i << std::endl; }
Câu lệnh return
Dùng để trả về giá trị từ hàm và kết thúc hàm đó.
int add(int a, int b) { return a + b; }
Cú pháp lập trình C++ cơ bản: Câu lệnh liên quan đến lớp và đối tượng
Khai báo Lớp và Đối tượng
Lớp là một khối mã đại diện cho các đối tượng với thuộc tính và phương thức.
class Person { public: std::string name; int age; void introduce() { std::cout << "Hi, I'm " << name << " and I'm " << age << " years old." << std::endl; } };
Gọi phương thức của đối tượng
Person person1; person1.name = "John"; person1.age = 30; person1.introduce();
Kế thừa (Inheritance)
Khái niệm kế thừa trong OOP: Kế thừa cho phép một lớp (class) thừa hưởng các thuộc tính và phương thức của một lớp khác. Điều này giúp tái sử dụng mã nguồn và tạo ra các hệ thống phần mềm linh hoạt và dễ bảo trì.
Ví dụ về kế thừa:
#include <iostream> using namespace std; // Lớp cơ sở class Animal { public: void eat() { cout << "Eating..." << endl; } }; // Lớp dẫn xuất class Dog : public Animal { public: void bark() { cout << "Barking..." << endl; } }; int main() { Dog d; d.eat(); // Gọi hàm từ lớp cơ sở d.bark(); // Gọi hàm từ lớp dẫn xuất return 0; }
Trong ví dụ này, lớp Dog kế thừa từ lớp Animal. Điều này có nghĩa là Dog có thể sử dụng các phương thức của Animal, như eat(), và cũng có thể định nghĩa các phương thức riêng của mình, như bark().
Đa hình (Polymorphism)
Khái niệm và tầm quan trọng của đa hình: Đa hình cho phép các đối tượng thuộc các lớp khác nhau có thể được xử lý thông qua cùng một giao diện, giúp mã nguồn trở nên linh hoạt và dễ bảo trì hơn.
Ví dụ về đa hình:
#include <iostream> using namespace std; class Animal { public: virtual void sound() { cout << "Animal sound" << endl; } }; class Dog : public Animal { public: void sound() override { cout << "Woof Woof" << endl; } }; class Cat : public Animal { public: void sound() override { cout << "Meow Meow" << endl; } }; void makeSound(Animal *a) { a->sound(); } int main() { Dog d; Cat c; makeSound(&d); // Gọi hàm sound của Dog makeSound(&c); // Gọi hàm sound của Cat return 0; }
Constructor và destructor
- Constructor: Là một hàm đặc biệt được gọi tự động khi một đối tượng của lớp được tạo ra. Constructor có nhiệm vụ khởi tạo các thuộc tính của đối tượng.
- Destructor: Là một hàm đặc biệt được gọi tự động khi đối tượng bị hủy. Destructor có nhiệm vụ giải phóng tài nguyên hoặc thực hiện các công việc cần thiết khi đối tượng không còn được sử dụng nữa.
Cách tạo và sử dụng constructor và destructor trong lớp
- Constructor và destructor không có kiểu trả về, kể cả void.
- Constructor có thể có tham số, còn destructor thì không có tham số.
Ví dụ về constructor và destructor:
Constructor:
class Person { public: std::string name; int age; // Constructor Person(std::string n, int a) { name = n; age = a; } void introduce() { std::cout << "Hi, I'm " << name << " and I'm " << age << " years old." << std::endl; } }; int main() { Person person1("John", 30); person1.introduce(); return 0; }
Destructor:
class Person { public: std::string name; int age; // Constructor Person(std::string n, int a) { name = n; age = a; } // Destructor ~Person() { std::cout << "Person object destroyed." << std::endl; } void introduce() { std::cout << "Hi, I'm " << name << " and I'm " << age << " years old." << std::endl; } }; int main() { Person person1("John", 30); person1.introduce(); return 0; }
Trong ví dụ này, hàm makeSound chấp nhận một con trỏ đến Animal và gọi phương thức sound().
Khi gọi makeSound với một đối tượng Dog hoặc Cat, phương thức sound tương ứng của các lớp này sẽ được gọi, thể hiện tính đa hình.
Lập trình C++ cơ bản: Xử lý ngoại lệ (Exception Handling)
Khái niệm và mục đích của xử lý ngoại lệ: Xử lý ngoại lệ là một kỹ thuật quan trọng giúp chương trình có thể xử lý lỗi một cách an toàn và hiệu quả.
Ví dụ về xử lý ngoại lệ:
#include <iostream> using namespace std; int main() { try { int a = 10; int b = 0; if (b == 0) throw "Division by zero error"; cout << a / b << endl; } catch (const char* msg) { cerr << "Error: " << msg << endl; } return 0; }
Trong ví dụ này, ngoại lệ được ném bằng từ khóa throw và được bắt bằng khối catch. Điều này giúp xử lý lỗi một cách an toàn và cung cấp thông tin lỗi cụ thể.
Lập trình C++ cơ bản: Thư viện STL (Standard Template Library)
Giới thiệu về STL: STL là một phần quan trọng của thư viện chuẩn C++, cung cấp nhiều cấu trúc dữ liệu và thuật toán mạnh mẽ giúp tăng tốc độ phát triển phần mềm.
Ví dụ về sử dụng vector và thuật toán sort:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> v = {4, 2, 3, 1, 5}; sort(v.begin(), v.end()); // Sắp xếp vector for (int i : v) cout << i << " "; cout << endl; return 0; }
Trong ví dụ này, vector được sử dụng để lưu trữ một danh sách các số nguyên, và thuật toán sort từ STL được sử dụng để sắp xếp danh sách này.
Lập trình C++ cơ bản: Template
Khái niệm và lợi ích của template: Template trong C++ cho phép tạo ra các hàm và lớp tổng quát, có thể làm việc với nhiều kiểu dữ liệu khác nhau.
Ví dụ về function template:
#include <iostream> using namespace std; template <typename T> T add(T a, T b) { return a + b; } int main() { cout << add<int>(3, 4) << endl; // Sử dụng template với kiểu int cout << add<double>(3.5, 4.5) << endl; // Sử dụng template với kiểu double return 0; }
Trong ví dụ này, hàm add là một function template có thể làm việc với nhiều kiểu dữ liệu khác nhau, như int và double.
Lập trình C++ cơ bản: Lập trình đa luồng (Multithreading)
Khái niệm cơ bản về đa luồng: Lập trình đa luồng giúp cải thiện hiệu suất của chương trình bằng cách cho phép thực thi nhiều tác vụ song song.
Ví dụ về tạo và quản lý các luồng:
#include <iostream> #include <thread> using namespace std; void printMessage(string message) { cout << message << endl; } int main() { thread t1(printMessage, "Hello from thread 1"); thread t2(printMessage, "Hello from thread 2"); t1.join(); // Chờ thread 1 hoàn thành t2.join(); // Chờ thread 2 hoàn thành return 0; }
Trong ví dụ này, hai luồng được tạo ra để in thông điệp. Hàm join được sử dụng để đảm bảo rằng chương trình chính chờ các luồng hoàn thành trước khi kết thúc.
Câu hỏi thường gặp về lập trình C++ cơ bản
Làm thế nào để bắt đầu học các câu lệnh lập trình C++ cơ bản?
Học từ các tài liệu và sách cơ bản về C++. Thực hành viết mã thường xuyên và tham gia các dự án nhỏ để làm quen với cú pháp và cách sử dụng các câu lệnh.
Những lỗi thường gặp khi sử dụng câu lệnh C++ là gì?
- Lỗi cú pháp: Sửa lại mã theo thông báo lỗi từ trình biên dịch.
- Lỗi phân đoạn: Kiểm tra các con trỏ và chỉ số mảng.
- Lỗi logic: Sử dụng các công cụ debug để theo dõi và tìm hiểu vấn đề.
Làm thế nào để debug chương trình C++ hiệu quả?
Sử dụng các công cụ như GDB, Visual Studio Debugger để kiểm tra mã từng bước, xem giá trị biến, và phát hiện lỗi.
C++ có thể được sử dụng cho những ứng dụng nào?
C++ được sử dụng trong phát triển hệ điều hành, trò chơi, ứng dụng nhúng, phần mềm doanh nghiệp, và nhiều lĩnh vực khác đòi hỏi hiệu năng cao và khả năng quản lý bộ nhớ tốt.
Tổng kết lập trình C++ cơ bản
Trong phần này, chúng ta đã khám phá các câu lệnh nâng cao trong C++, từ kế thừa, đa hình, xử lý ngoại lệ, thư viện STL, template, cho đến lập trình đa luồng. Việc hiểu và sử dụng thành thạo những câu lệnh này không chỉ giúp bạn viết code hiệu quả hơn mà còn mở ra cơ hội phát triển các ứng dụng phức tạp và đa dạng.
Khi nắm vững lập trình C và C++, bạn sẽ có khả năng xử lý các bài toán khó khăn và phát triển phần mềm chất lượng cao. Hãy tiếp tục thực hành và khám phá sâu hơn để nâng cao kỹ năng của mình. Nhớ rằng, việc không ngừng học hỏi và áp dụng các kiến thức mới sẽ giúp bạn trở nên thành thạo và sáng tạo hơn trong lĩnh vực phát triển phần mềm.
Tham khảo thêm các bài viết thuộc chủ đề Lập trình C++: