Search…

C++11 - Từ Khóa auto

15/09/20203 min read
Tìm hiểu về từ khoá auto trong C++.

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_aSTDIO_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.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024