Toán tử ‘typeid’ trong C++ | CppDeveloper

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.

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 . Object trả về này có thể được dùng để so sánh ‘==’ hoặc ‘!=’ với một object khác của type_info hoặc cũng có thể dùng để lấy ra string có chứa tên của kiểu dữ liệu thông qua phương thức name() của type_info.

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

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 ) —