📜  C++中的reinterpret_cast |类型转换运算符

📅  最后修改于: 2021-05-30 14:50:27             🧑  作者: Mango

reinterpret_cast是C++中使用的一种强制转换运算符。

  • 它用于转换任何类型的另一种指针的一个指针,而不管该类是否相互关联。
  • 它不检查指针类型和指针所指向的数据是否相同。

句法 :

data_type *var_name = 
       reinterpret_cast (pointer_variable);

退货类型

  • 它没有任何返回类型。它只是转换指针类型。

参数

  • 它仅采用一个参数,即源指针变量(上例中为p)。
// CPP program to demonstrate working of 
// reinterpret_cast
#include 
using namespace std;
  
int main()
{
    int* p = new int(65);
    char* ch = reinterpret_cast(p);
    cout << *p << endl;
    cout << *ch << endl;
    cout << p << endl;
    cout << ch << endl;
    return 0;
}
输出:
65
A
0x1609c20
A

使用reinterpret_cast的目的

  1. reinterpret_cast是一种非常特别且危险的类型转换运算符。并且建议使用适当的数据类型来使用它,即(指针数据类型应与原始数据类型相同)。
  2. 它可以将任何指针类型转换为任何其他数据类型。
  3. 当我们要使用位时使用它。
  4. 如果我们使用这种类型的演员表,那么它将变成不可携带的产品。因此,除非必要,否则建议不要使用此概念。
  5. 它仅用于将任何指针转换为其原始类型。
  6. 布尔值将转换为整数值,即0表示false,1表示true。
// CPP code to illustrate using structure
#include 
using namespace std;
  
// creating structure mystruct
struct mystruct {
    int x;
    int y;
    char c;
    bool b;
};
  
int main()
{
    mystruct s;
  
    // Assigning values
    s.x = 5;
    s.y = 10;
    s.c = 'a';
    s.b = true;
  
    // data type must be same during casting
    // as that of original
  
    // converting the pointer of 's' to,
    // pointer of int type in 'p'.
    int* p = reinterpret_cast(&s);
  
    cout << sizeof(s) << endl;
  
    // printing the value currently pointed by *p
    cout << *p << endl;
  
    // incrementing the pointer by 1
    p++;
  
    // printing the next integer value
    cout << *p << endl;
  
    p++;
  
    // we are casting back char * pointed
    // by p using char *ch.
    char* ch = reinterpret_cast(p);
  
    // printing the character value
    // pointed by (*ch)
    cout << *ch << endl;
  
    ch++;
  
    /* since, (*ch) now points to boolean value,
    so it is required to access the value using 
    same type conversion.so, we have used 
    data type of *n to be bool. */
  
    bool* n = reinterpret_cast(ch);
    cout << *n << endl;
  
    // we can also use this line of code to
    // print the value pointed by (*ch).
    cout << *(reinterpret_cast(ch));
  
    return 0;
}
输出:
12
5
10
a
1
1

程序2

// CPP code to illustrate the pointer reinterpret
#include 
using namespace std;
  
class A {
public:
    void fun_a()
    {
        cout << " In class A\n";
    }
};
  
class B {
public:
    void fun_b()
    {
        cout << " In class B\n";
    }
};
  
int main()
{
    // creating object of class B
    B* x = new B();
  
    // converting the pointer to object
    // referenced of class B to class A
    A* new_a = reinterpret_cast(x);
  
    // accessing the function of class A
    new_a->fun_a();
    return 0;
}
输出:
In class A

相关链接:
https://www.geeksforgeeks.org/casting-operators-in-c-set-1-const_cast/
https://stackoverflow.com/questions/573294/when-to-use-reinterpret-cast” rel =“ noopener” target =“ _ blank
http://forums.codeguru.com/showthread。 PHP的?482227-reinterpret_cast-lt-gt和在哪里可以使用
https://www.ibm.com/support/knowledgecenter/zh-CN/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/keyword_reinterpret_cast.htm
https://stackoverflow.com/questions/573294/when-to-use-reinterpret-cast

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”