Danh sách bài viết về C++11
Từ khóa auto ở C++03
Với từ khóa auto
, 1 biến sẽ chỉ định cho trình biên dịch biết rằng, nó có thời gian "sống" trong 1 phạm vi cục bộ. Các biến auto
sẽ không được khởi tạo tự động, chính vì vậy, dòng code sau sẽ sinh ra lỗi
auto int STDIO_uninitialized_local_variable; int STDIO_implicit_auto = STDIO_uninitialized_local_variable;
Dòng code thứ 2 sẽ lỗi vì biến ta đang sử dụng 1 biến chưa được khởi tạo STDIO_uninitialized_local_variable
. Theo logic thì không thể gán 1 biến chưa có giá trị gì cho 1 biến khác. Có thể sửa lại thành code như sau, trình biên dịch sẽ chấp nhận
auto int STDIO_uninitialized_local_variable = 0; int STDIO_implicit_auto = STDIO_uninitialized_local_variable;
Phạm vi của auto
Biến auto
sẽ được khởi tạo và tồn tại trong 1 phạm vi cục bộ cho đến khi thoát khỏi phạm vi cục bộ sẽ được thu hồi
{ // Tạo khi vào phạm vi này và bị thu hồi sau khi thoát khỏi phạm vi này auto int STDIO_uninitialized_local_variable = 0; }
Tinh giản từ khóa auto
Chính vì từ khóa auto
chỉ sử dụng cho biến cục bộ (local), nên trình biên dịch cho phép tinh giản từ khóa này và chỉ cần khai báo như bên dưới, cách khai báo 2 biến STDIO_a
và STDIO_b
là tương đương
auto char STDIO_a = 'x'; char STDIO_b = 'y';
Từ khóa auto ở C++11
Với từ khóa auto
ở phiên bản C++11 nó có ý nghĩa khác hoàn toàn với C++03, nó có nghĩa là, tự động nhận dạng kiểu dữ liệu thông qua kiểu dữ liệu của giá trị khởi tạo ra nó
// STDIO_c kiểu char do 'c' kiểu char auto STDIO_c = 'c'; // STDIO_i kiểu int do 10 kiểu int auto STDIO_i = 10; // STDIO_p kiểu int* do new int[3] trả về kiểu int* auto STDIO_p = new int[3]; // STDIO_li_i kiểu list<int>::iterator do li.begin() trả về kiểu list<int>::iterator list<int> li; auto STDIO_li_i = li.begin();
Lưu ý rằng, với
auto
thì biến phải được khởi tạo ngay để trình biên dịch nhận dạng, và khi đã nhận dạng kiểu dữ liệu thì không được thay đổi kiểu dữ liệu nữa.
Lợi ích và điều bất lợi
Lợi ích của auto
trong C++11 là khá lớn trong việc tăng tốc phát triển ứng dụng. Đôi lúc các kiểu dữ liệu rất to lớn và dài, việc sử dụng "tự động chọn kiểu" như auto
sẽ giúp cho code ngắn gọn vì "dù gì cũng phải gõ lại đúng kiểu", bớt các công việc tay chân, như ví dụ trên thấy list<int>::iterator
là kiểu dữ liệu gõ khá dài. Ví dụ: Concurrency::task<Platform::Array<byte>^>
(trích trong 1 project mẫu của Direct3D Windows Phone 8 với XAML).
Nhược điểm của loại biến này là sự không tường minh trong mã nguồn, gây ra việc khó tra cứu nguồn gốc (kiểu dữ liệu) của 1 biến.