Bài viết là tài liệu tham khảo cho khóa đào tạo lập trình C/C++ của STDIO Training.
Tìm hiểu và đăng ký học tại đây.
La Kiến Vinh Giới thiệu và hướng dẫn cách thức sử dụng từ khóa auto trong C++11, một từ khóa mới và dễ gây nhầm lẫn với từ khóa auto trong phiên bản C++98/C++03. Lợi ích của từ khóa này là tốc độ phát triển nhanh hơn, bất lợi sẽ làm cho chương trình không tường minh.
Nội dung bài viết

Giới thiệu

Từ phiên bản C++03 (hay C++03 trở về trước), C++ đã đủ tốt để chúng ta phát triển ứng dụng nhanh, theo xu thế, nó tiến hóa hơn để việc phát triển ứng dụng nhanh hơn nữa. Trong bài viết này, tôi đề cập từ khóa auto trong C++11 vì nó dễ gây nhầm lẫn với từ khóa auto trong phiên bản C++03.

Đối tượng hướng đến

Bài viết hướng đến các đối tượng đã thao tác nhiều năm với C++, vì từ khóa auto ở các phiên bản C++ trước dành cho mục đích khác và cũng bị lược bỏ trong khai báo nên có thể bạn sẽ không vướng phải, tuy nhiên, các lập trình viên có kinh nghiệm từng sử dụng qua từ khóa này có thể sẽ gặp trục trặc.

Ngoài ra bài viết này cũng nhằm giới thiệu từ khóa auto cho các bạn lập trình viên mới tiếp cận C++ ở thế hệ mới, vì dù bạn không biết auto ở thế hệ cũ, thì bạn vẫn có thể phải dùng auto ở thế hệ mới này.

Danh sách bài viết về C++11

Từ khóa auto ở C++03

Với từ khóa auto, một biến sẽ chỉ định cho trình biên dịch biết rằng, nó có thời gian "sống" trong một 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 một biến chưa được khởi tạo STDIO_uninitialized_local_variable. Theo logic thì bạn không thể gán một biến chưa có giá trị gì cho một biến khác. Bạn 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à ta 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 ta 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 một 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 một biến.

THẢO LUẬN
ĐÓNG