C++11 và C++14
C++11: Chuẩn C++11, còn được gọi là C++0x, được phát hành chính thức vào tháng 9 năm 2011. Nó giới thiệu một số tính năng và cải tiến ngôn ngữ mới, bao gồm:
- Tự động: Cho phép trình biên dịch suy ra loại biến dựa trên biểu thức khởi tạo của nó.
auto integer = 42; // số nguyên có kiểu int auto floating = 3.14; // số thực là loại kép
- Vòng lặp dựa trên phạm vi: Cung cấp ngữ nghĩa giống như foreach để lặp qua vùng chứa hoặc mảng.
std::vector<int> numbers {1, 2, 3, 4}; for (int number : numbers) { std::cout << number << std::endl; }
- Hàm Lambda: Các hàm ẩn danh cho phép tạo các đối tượng hàm dễ dàng hơn.
auto add = [](int a, int b) -> int { return a + b; }; int sum = add(42, 13); // tổng bằng 55
- nullptr: Một từ khóa mới để biểu thị các con trỏ null, an toàn hơn so với sử dụng chữ '0' hoặc "NULL".
int *ptr = nullptr;
- Thư viện hỗ trợ luồng: Cung cấp một cách chuẩn để làm việc với các luồng và đồng bộ hóa truy cập dữ liệu giữa các luồng.
std::thread t([]() { std::cout << "Hello from another thread\n"; }); t.join();
C++14: Chuẩn C++14 được phát hành chính thức vào tháng 12 năm 2014 dưới dạng một phần mở rộng nhỏ so với C++11, tập trung nhiều hơn vào các tính năng ngôn ngữ tinh chỉnh và khắc phục sự cố. Một số tính năng mới được giới thiệu:
- Lambda chung: Cho phép khai báo các tham số hàm lambda với trình giữ chỗ loại 'tự động'.
auto add = [](auto a, auto b) { return a + b; }; auto sum_i = add(42, 13); // Vẫn hoạt động với số nguyên auto sum_f = add(3.14, 2.72); // Bây giờ cũng hoạt động với số kép
- Chữ nhị phân: Cho phép bạn nhập số nguyên dưới dạng chữ nhị phân để dễ đọc hơn.
int b = 0b110101; // Giá trị thập phân là 53
- decltype(auto): Suy ra loại biến để khớp với loại của biểu thức mà nó được khởi tạo.
auto func = [](auto a, auto b) { return a * b; }; decltype(auto) result = func(5, 3.14); // decltype(auto) suy ra thành "số kép"
- Mẫu biến: Cho phép bạn xác định các biến với tham số mẫu.
template <typename T> constexpr T pi = T(3.1415926535897932385); float r = pi<float>; // Khởi tạo dưới dạng float double d = pi<double>; // Khởi tạo dưới dạng double