Cú pháp cơ bản của typedef
Cú pháp của typedef tương đối giống với khai báo biến và hàm, tuy nhiên mục đích của nó là để định nghĩa một tên khác cho một kiểu dữ liệu →
1 2 3 4 |
int T; // T có kiểu dữ liệu là int typedef int T; // T là một (alias) tên gọi khác của kiểu int int A[100]; // A là một mảng 100 phần tử int typedef int A[100]; // A là một alias (tên gọi khác) của kiểu "mảng 100 phần tử int" |
Một khi type alias (tên thay thế) của một kiểu dữ liệu đã được định nghĩa thì tên đó có thể được dùng thay thế cho tên của kiểu dữ liệu gốc →
1 2 3 4 5 6 |
typedef int A[100]; // A là một alias (tên gọi khác) của kiểu "mảng 100 phần tử int" // SampleStruct là một struct chứa một mảng 100 phần tử int struct SampleStruct { A data; }; |
Một số cú pháp nâng cao hơn của typedef
Định nghĩa kiểu dữ liệu con trỏ hàm thông thường →
1 2 3 |
void (*f)(int); // f là "con trỏ tới hàm có 1 tham số kiểu int, trả về void" typedef void (*f)(int); // f là alias của kiểu "con trỏ tới hàm có // 1 tham số kiểu int, trả về void" |
1 2 3 4 |
void (Foo::*pmf)(int); // pmf là một alias của "con trỏ tới hàm thành viên của Foo // có một tham số int trả về void" typedef void (Foo::*pmf)(int); // pmf là một alias của kiểu "con trỏ tới hàm // thành viên của Foo có một tham số int, trả về void |
1 2 |
int *x, (*p)(); // x kiểu int*, p kiểu int(*)() typedef int *x, (*p)(); // x là alias của int*, p là alias của int(*)() |
Khai báo alias sử dụng “using”
Từ C++11 chúng ta có thể sử dụng cú pháp using thay thế typedef →
1 2 3 4 5 |
using I = int; // kiểu int using A = int[100]; // kiểu dữ liệu array có 100 phần tử int using FP = void(*)(int); // kiểu dữ liệu "con trỏ tới hàm có 1 tham số kiểu int, trả về void" using MP = void (Foo::*)(int); // kiểu dữ liệu "con trỏ tới hàm thành viên của Foo có một tham số int, // trả về void |
Tạo một alias kiểu dữ liệu bằng using có tác dụng chính xác giống như với typedef. Nó chỉ đơn giản là một cú pháp thay thế để hoàn thành điều tương tự. Tuy nhiên có một điểm khác biệt đó là using có thể sử dụng với template trong khi typedef thì không. Hãy xem ví dụ sao để rõ hơn →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> using namespace std; template <typename T> class Sample { private: T t; public: void setValue(T t) { this->t = t; } void printf() { cout << t << endl; } }; using Sample_int = Sample<int>; // typedef Sample_int Sample<int>; --> Không dùng được typedef với template int main() { Sample_int sample; sample.setValue(10); sample.printf(); return 0; } |
— Phạm Minh Tuấn (Shun) —