Trong C++ cung cấp cho người lập trình 2 từ khóa typedef & define rất quan trọng và phổ biến mà bất kì ai học cũng nên biết và sử dụng nó như một thói quen. Chúng có ưu điểm như thế nào mời các bạn xem bài viết của mình nhé.
Mục lục bài viết
Từ khóa typedef
typedef
là từ khóa cho phép người dùng thêm tên mới cho kiểu có sẵn với cú pháp như sau:
typedef key_word new_name_use;
Ví dụ:
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; typedef unsigned long int uln; int main() { ll val = 0877074074; db val1 = 1.1; uli val2 = 08770740740; cout<<val<<endl; cout<<val1<<endl; cout<<val2<<endl; return 0; }
Khi này kiểu dữ liệu long long
bạn hoàn toàn có thể thay thế bằng ll khi code.
NOTE: bạn hoàn toàn có thể thêm nhiều tên mới cho một kiểu.
Từ khóa typedef
có thể thêm tên mới cho class hay struct được không? Các bạn cùng mình xét ví dụ sau đây nhé:
#include <bits/stdc++.h> using namespace std; class CodeLearn { public: CodeLearn() { cout<<"Code Learn"<<endl; } }; typedef CodeLearn CL; struct codelearn { void printf() { cout<<"code learn"<<endl; } }; typedef codelearn cl; int main() { CL CL1; cl cl1; cl1.printf(); return 0; }
Kết quả của chương trình:
[external_link offset=1]Code Learn
code learn
Như vậy ta có thể thấy typedef có thể thêm được tên mới cho các kiểu mà người dùng định nghĩa (class & struct) và nó giúp chúng ta dễ ghi nhớ tên của các kiểu dữ liệu, lớp hay cấu trúc một cách dễ dàng, dễ hiểu và dễ sử dụng hơn. Đồng thời nó cũng giúp giảm đi thời gian code đáng kể đấy.
Một lưu ý nhỏ là cú pháp khi dùng typedef không thể thay thế như sau:
typedef new_name_use key_word;
lỗi này tuy nhỏ nhưng cá nhân mình thấy có thấy nhiều bạn khi mới sử dụng rất hay bị sai.
Từ khóa define
define
cũng là một từ khóa cho phép bạn đặt một tên mới cho một kiểu dữ liệu, một số hay một hàm với cú pháp như sau:
define new_name_use name_want_swap
Xét ví dụ:
#include <bits/stdc++.h> using namespace std; #define number int #define loop(i,a,n) for(int i=0 ; i<n ; i++) #define pub push_back #define pob pop_back int main() { number n; //khai báo biến n kiểu int cout<<"N = "; cin>>n; vector <int> arr; //tạo 1 vector arr kiểu int //tạo giá trị cho các phần tử của vector loop(i,0,n) { arr.pub(i); } arr.pob(); // xóa phần tử cuối cùng của vector arr //in ra các giá trị của vector arr loop(i,0,arr.size()) { cout<<arr[i]<<" "; } return 0; }
Kết quả của chương trình:
Xét câu lệnh #define loop(i,a,n) for(int i=0 ; i<n ; i++)
ở đây loop(1,a,n)
sẽ được thay thế bởi for(int i=0 ; i<n ; i++)
khi chương trình chạy.
Còn push_back
là câu lệnh thêm phần tử vào cuối vector sẽ được thay thế bởi pub
, pop_back
là câu lệnh bỏ đi phần tử cuối cùng của vector sẽ được thay thế bởi pob
.
Như vậy chúng ta có thể thấy #define rất mạnh khi lập trình, nó giúp chúng ta thay thế được mọi thứ bằng một tên gọi mới gợi nhớ hơn, chúng ta có thể khai báo hằng, có thể thay thế vòng lặp, có thể thay thế tên kiểu,… Đặc biệt hơn nó giúp chúng ta giảm tải 1 khoảng thời gian code đi code lại những đoạn code trùng nhau, giúp cho chương trình trở nên ngắn gọi và dễ hiểu hơn.
Một lưu ý nhỏ là cú pháp khi dùng define không thể thay thế như sau:
define new_name_use name_want_swap;
hay define name_want_swap new_name_use
lỗi này tuy nhỏ nhưng cá nhân mình thấy có thấy nhiều bạn khi mới sử dụng rất hay bị sai.
Khi code chúng ta không được phép đặt tên biến giống với tên được thay thế ở #define. Vì, define hoạt động theo cơ chế precompile(tiền biên dịch) tức là dịch trước chạy sau.
Xét ví dụ cụ thể cho dễ hiểu nhé:
#include <bits/stdc++.h> using namespace std; #define PI = 3.14159 int main() { double PI = 3.14; return 0; }
Các bạn thử chạy xem lỗi như thế nào nhé!
Điểm khác nhau giữa hai anh em TYPEDEF & DEFINE
Xét tổng thể các ví dụ trên thì chúng ta có thể thấy điểm khác nhau lớn nhất giữa typedef & define là: typedef
chỉ có thể thêm tên mới cho các kiểu có sẵn hoặc do người dùng định nghĩa còn define
nó rộng hơn typedef ở chỗ là nó có thể thay thế hoặc định nghĩa cho biến, cho kiểu, cho vòng lặp…
Sự phiên dịch typedef
được thực hiện bởi bộ biên dịch, trong khi lệnh #define
được xử lý bởi bộ tiền xử lý.
Kết
Khi học tập và làm việc với C++ chắc chắn sẽ không thể bỏ qua kiến thức về typedef & define. Qua bài viết này mình đã giới thiệu cũng như minh họa cụ thể cho các bạn về hai anh em typedef & define, mong các bạn có thể hiểu và áp dụng chúng thường xuyên. Hẹn gặp các bạn trong các bài viết tiếp theo. [external_footer]