程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++的顯示轉換,顯示轉換

C++的顯示轉換,顯示轉換

編輯:C++入門知識

C++的顯示轉換,顯示轉換


利用顯示轉換使得我們可以很容易發現它們,因為通過名字就能找到:

 static_cast 用於“良性”和“適度良性”轉換,包括不用強制轉換  const_cast  對“const”和“volatile”進行轉換  reinterpret_cast 轉換為完全不同的意思,為了安全使用它,關鍵必須轉換為原來的類型 。這是所有轉換中最危險的  dynamic_cast 用於類型安全向下轉換 

1.靜態轉換(static_cast)

static_cast包含的轉換類型包括典型的非強制變換,窄化(有信息丟失)變換,使用void*的強制轉換,隱式類型變換和類層次的靜態定位。

用法:static_cast < type-id > ( expression )    

該運算符把expression轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性。它主要有如下幾種用法:
①用於類層次結構中基類和子類之間指針或引用的轉換。
  進行上行轉換(把子類的指針或引用轉換成基類表示)是安全的;
  進行下行轉換(把基類指針或引用轉換成子類表示)時,由於沒有動態類型檢查,所以是不安全的。
②用於基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
③把空指針轉換成目標類型的指針。

void func(int){}

int main()

{

   int i=0x7fff;

   long l;

   float f;

 

   //典型的非強制類型轉換

   l=i;

   f=i;

 

   l=static_cast<long>(i);

   f=static_cast<float>(i);

 

   //窄化變換

   i=l;

   i=f;

  

   i=static_cast<int>(l);

   i=static_cast<int>(f);

   char c=static_cast<char>(i);

 

   //使用void* 的強制變換

   void* vp=&i;

   float* fp=(float*)vp;

 

   //Error:C++中不用強制轉換是不能從void* 中賦值的

  // fp=vp;

 

   fp=static_cast<float*>(vp);

 

   //隱式類型變換

   double d=0.0;

   int x=d;

 

   x=static_cast<int>(d);

   func(d);

   func(static_cast<int>(d));

   return 0;

}

 

2.常量變換(const_cast)

用法:const_cast<type_id> (expression)
該運算符用來修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類型是一樣的。
常量指針被轉化成非常量指針,並且仍然指向原來的對象;
常量引用被轉換成非常量引用,並且仍然指向原來的對象;

 

如果從const轉換為非const,或從volatile轉換為非volatile,或者從非const轉換為const ,非volatile轉換為volatile可以使用const_cast。

 

int main()

{

       const int i=0;

       //Error:取得const對象的指針,不用轉換是不能把它賦值給非const指針的

      // int* j=&i;

 

        int* j=(int*)&i;

        j=const_cast<int*>(&i);

     

 //Error:const_cast<type_id>(expression)中除了const 或volatile修飾之外,type_id和expression的類型是一樣的

       // long* l=const_cast<long*>(&i);

 

        volatile int k=0;

        int* u=const_cast<int*> (&k);

      

}

 

3.重解釋轉換(reinterpret_cast)

用法:reinterpret_cast<type-id> (expression)
type-id必須是一個指針、引用、算術類型、函數指針或者成員指針。
它可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,在把該整數轉換成原類型的指針,還可以得到原先的指針值)。

這是最不安全的一種轉換機制。reinterpret_cast把對象假象成另一個完全一個不同類型的對象。reinterpret_cast的思想就是當需要使用的時候,所得到的東西已經不同了,以至於它不能用於類型的原來目的,除非再次把它轉換回來。

#include <iostream>

using namespace std;

const int sz=100;

 

struct X{int a[sz];};

 

void print(X* x)

{

       for(int i=0;i<sz;i++)

       {

              cout<<x->a[i]<<" ";

             

       }

       cout<<endl<<"-----------------"<<endl;

}

int main()

{

       X x;

       print(&x);                  //出來的是沒有意義的值

 

       int* xp=reinterpret_cast<int*>(&x);

       for(int* i=xp;i<xp+sz;i++)

       {

              *i=0;

       }

       print(reinterpret_cast<X*>(xp));

       print(&x);

}


C語言,C++中顯式轉換與隱式轉換的不同?

c方式類型轉換:(target_type)(value),如int i = 5; char c = (char)(i);
c++方式類型轉換:方式有4種
static_cast類似c語言的類型轉換
dynamic_cast繼承體系直接引用和指針直接的轉換
const_cast常量轉換,常量轉換成非常量,非常量轉換成常量
reintepret_cast重新解釋轉換,重新解釋數值的含義,如int轉換成char*等
 

對於c語言中的類型轉換,了

float a;
a=3.74

float a;
a=(float)3.74
是等價的.

所謂隱式類型轉換就是當精度小的數據賦給精度高的
數據時自動將精度小的轉換為精度高的如:
int a=3;
float b;
b=a;
當執行到b=a時,自動將a的值3轉換為浮點數的3

所謂的顯式類型轉換就是當精度高的數據賦給精度低
的數據時要顯示的轉換它如:
int a;
float b=3.23;
a=(int)b;
當執行到a=(int)b的時候顯示地將b轉換為整型賦給a
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved