C++中的強制轉換

來源:互聯網
上載者:User

標準c++中主要有四種強制轉換類型運算子:

  const_cast,reinterpret_cast,static_cast,dynamic_cast等等。

  1)static_cast<T*>(a)

  將地址a轉換成類型T,T和a必須是指標、引用、算術類型或枚舉類型。

  運算式static_cast<T*>(a), a的值轉換為模板中指定的類型T.在運行時轉換過程中,不進行類型檢查來確保轉換的安全性。

  例子:

  class B { ... };

  class D : public B { ... };

  void f(B* pb, D* pd)

  {

  D* pd2 = static_cast<D*>(pb);        // 不安全, pb可能只是B的指標

  B* pb2 = static_cast<B*>(pd);        // 安全的

  ...

  }

    2)dynamic_cast<T*>(a)

  完成類階層中的提升。T必須是一個指標、引用或無類型的指標。a必須是決定一個指標或引用的運算式。

  運算式dynamic_cast<T*>(a) 將a值轉換為類型為T的對象指標。如果類型T不是a的某個基底類型,該操作將返回一個null 指標。

  例子:

  class A { ... };

  class B { ... };

  void f()

  {

  A* pa = new A;

  B* pb = new B;

  void* pv = dynamic_cast<A*>(pa);

  // pv 現在指向了一個類型為A的對象

  ...

  pv = dynamic_cast<B*>(pb);

  // pv 現在指向了一個類型為B的對象

  }

  3)const_cast<T*>(a)

  去掉類型中的常量,除了const或不穩定的變址數,T和a必須是相同的類型。

  運算式const_cast<T*>(a)被用於從一個類中去除以下這些屬性:const, volatile, 和 __unaligned.

  例子:

  class A { ... };

  void f()

  {

  const A *pa = new A;//const對象

  A *pb;//非const對象

  //pb = pa; // 這裡將出錯,不能將const對象指標賦值給非const對象

  pb = const_cast<A*>(pa); // 現在OK了

  ...

  }

    4)reinterpret_cast<T*>(a)

  任何指標都可以轉換成其它類型的指標,T必須是一個指標、引用、算術類型、指向函數的指標或指向一個類成員的指標。

  運算式reinterpret_cast<T*>(a)能夠用於諸如char* 到 int*,或者One_class* 到 Unrelated_class*等類似這樣的轉換,因此可能是不安全的。

  例子:

  class A { ... };

  class B { ... };

  void f()

  {

  A* pa = new A;

  void* pv = reinterpret_cast<B*>(pa);

  // pv 現在指向了一個類型為B的對象,這可能是不安全的

  ...

  }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.