Từ C++11, Uniform Initialization (khởi tạo đồng nhất) cung cấp cú pháp nhất quán dùng cặp ngoặc nhọn {} để khởi tạo mọi loại biến/đối tượng: từ kiểu nguyên thủy đến aggregate, class, container.
Cú pháp chung
type var_name{arg1, arg2, ..., argN};
Các trường hợp ứng dụng
1. Khởi tạo mảng cấp phát động
int* pointer = new int[5]{10, 20, 30, 40, 50};
2. Khởi tạo mảng thành viên của class
class MyClass {
int arr[3];
public:
MyClass(int p, int q, int r) : arr{p, q, r} {}
void display() {
for (int c = 0; c < 3; c++) cout << arr[c] << ", ";
}
};
3. Trả về đối tượng ngầm (implicit return)
MyClass func(int p, int q) {
return {p, q}; // tự động gọi constructor MyClass(int, int)
}
4. Tham số hàm khởi tạo ngầm
void func(MyClass p) { p.display(); }
int main() { func({40, 50}); } // tạo MyClass tạm thời
Lưu ý quan trọng
- Hẹp chuyển đổi (narrowing conversion) bị cấm:
int x{3.14};lỗi compile. - Ưu tiên
initializer_listconstructor nếu class có. - Giúp tránh "Most Vexing Parse" (khái niệm hàm vs đối tượng).
Kết quả các ví dụ
The contents of array are: 10 20 30 40 50 The contents are: 40, 50, 60, (40, 50) (40, 50)
Tóm lại: Uniform initialization làm mã C++ nhất quán, an toàn và hiện đại hơn.