Tóm Tắt
Toán tử ‘typeid’ trong C++
Nếu như Java có typeof thì C++ có typeid. typeid là một toán tử một ngôi (unary operator) trong C++ dùng để lấy thông tin lúc runtime (Run-time Type Information- RTTI) về kiểu dữ liệu của một biểu thức hoặc của một kiểu dữ liệu cụ thể nào đó. typeid chỉ nhận một tham số duy nhất là một kiểu dữ liệu hoặc một expression.
Bạn đang đọc: Toán tử ‘typeid’ trong C++ | CppDeveloper
123 |
typeid(type); / / or typeid(expression); |
Giá trị trả về của typeid là một object kiểu ‘const std::type_info‘ được define trong file header
Example 1
1234567891011 |
#include
#include intmain() { intspeed=110; std::cout< if(typeid(speed)==typeid(int)){ std::cout<<" typeid ( speed ) = = typeid ( int ) "< } } |
12 |
i typeid(speed)==typeid(int) |
Example 2
123456789101112131415 |
#include
#include usingnamespacestd; intmain(){ int*a,b; a=0;b=0; if(typeid(a)!=typeid(b)){ cout<<" a and b are of different types : \ n "; cout<<" a is : "< cout<<" b is : "< } return0; } |
123 |
aandbareofdifferenttypes: ais:Pi b
Xem thêm: Lập trình tân binh | 2.6. Lớp và con trỏ is:i |
Example 3
12345678910111213141516171819202122 |
#include
#include
#include usingnamespacestd; classCBase{ virtualvoidf(){} }; classCDerived:publicCBase{}; intmain(){ CBase*a=newCBase; CBase*b=newCDerived; cout<<" a is : "< cout<<" b is : "< cout<<" * a is : "< cout<<" * b is : "< return0; } |
1234 |
ais:P5CBase bis:P5CBase *ais:5CB ase *bis:8CD erived |
Output : Output : Output :
Nhìn vào ouput của các ví dụ có thể thấy rằng hàm name() không đảm bảo trả về string chính xác tên của kiểu dữ liệu nên anh em chỉ nên sử dụng nó để log ra thông tin chứ đừng sử dụng nó để check kiểu dữ liệu. Để check kiểu thì hãy dùng các toán tử so sánh của type_info.
Ngoài ra có thể thấy rằng khi dùng typeid với tham số là một con trỏ như ‘b‘ thì thông tin mà typeid trả về là thông tin của bản thân con trỏ đó. Tuy nhiên, khi typeid dùng với object như ‘*b‘ thì thông tin kiểu dữ liệu mà typeid trả về là thông tin của cái gọi là ‘most derived class type‘. (anh em thông cảm dịch sang tiếng Việt khó vãi).
Để hiểu ‘most derived class type‘ là gì thì xem ví dụ sau →
123456 |
classBase1{}; classDerived1:Base1{}; classBase2{}; classFoo:Derived1,Base2{}; Foo obj ; |
Để hiểu ‘ most derived class type ‘ là gì thì xem ví dụ sau → Ở đây most derived class type của obj là ‘ Foo ‘— Phạm Minh Tuấn ( Shun ) —
Source: https://final-blade.com
Category : Kiến thức Internet