C++学习之——数据类型转换强制转换

在C++中,也提供了数据类型的强制类型转换,但方式与C不同,C中我们很容易把一种数据类型转换成另外一种数据类型,但在C++中,我们不提倡使用使用强制类型转换。C++中数据类型强制转换有四种转换的运算符,下面我来初步的介绍一下:


一  .   static_cast<T>(cexpr)         (T代表你将转换成的数据类型,cexpr是将要类型转换的变量名)

用途:用于所有普通基本类型转换,但不能用于基本类型的指针间的类型转换,可以用于继承关系对象之间的转换和类指针间的转换。

程序:
#include<iostream>
using namespace std;
class A
{
 public:
  int m_a;
};
class B : public A
{
 public:
  int m_b;
};
int main()
{
 int x=1;
 char y='b';
 x=static_cast<int>(y);//普通类型之间转换。
 int *px=&x;
 char *py=&y;
// px=static_cast<int *>(py);   //不能在普通指针之间进行转换。
 
 A a;
 B b;
 a=static_cast<A>(b);//可以在继承关系的类之间进行转换
 
 A *pa=&a;
 B *pb=&b;
 pa=static_cast<A *>(pb);//可以在有继承关系的类指针之间进行转换
 pb=static_cast<B *>(pa);
 return 0;
 }
 
 注意:static_cast是编译期进行转换的,无法在运行时检测类型。
 
 
 二 .   reinterpret_cast<T>(expr)

用途:(1).用于指针类型之间的强制类型转换。
          (2).用于整数和指针类型之间的强制类型转换。
 
 #include<iostream>
 
 using namespace std;
 
 int main()
 {
  int a=2;
  char b='c';
  int *pa=&a;
  char *pb=&b;
  pb=reinterpret_cast<char *>(pa);//用与普通指针类型转换。
  return 0;
 }
 
 
 
 
 
三  .  const_cast<T>(rxpr)

用途: 剥离一个对象的const属性,即转换后可以对常量进行修改。

 #include<iostream>
 
 using namespace std;
 
 int main()
 {
  const int a=1;             //相当于宏定义,后面的打印 a 都是1.
  int &c=const_cast<int &>(a);
  c=2;
  cout<<a<<endl;
  
  const int &b=3;
  int &d=const_cast<int &>(b);   //相当于d是b的一个别名引用,所有改变d就改变了b。
  d=4;
  cout<<b<<endl;
  return 0;
  }
 
 
 
 
 四   .  dynamic_cast<T>(expr)

用途:
    (1)主要用于类层次间的转换,还可以用于类之间的交叉转换
    (2)本运算符具有类型检查功能,比static_cast更安全。


 #include<iostream>
 
 using namespace std;
 
 class A
 {
  public:
   int m_a;
   virtual ~A(){}
 };
 
 
 class B : public A
 {
  public:
   int m_b;
 };
 
 int main()
 {
  A a;
  B b;
  A *pa=&a;
  B *pb=&b;
  pa=dynamic_cast<A *>(pb);// 继承关系派生类指针可以给基类指针,而且比static_cast更安全。
 pb=dynamic_cast<B *>(pa);
  return 0;
  }

猜你喜欢

转载自blog.csdn.net/Mao1253/article/details/80068493