欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于C++的強(qiáng)制類型轉(zhuǎn)換淺析

 更新時(shí)間:2017年09月10日 10:52:14   作者:Dawn_sf  
C++的強(qiáng)制類型轉(zhuǎn)換是我們?cè)谌粘i_發(fā)中經(jīng)常會(huì)遇到的,下面這篇文章主要給大家介紹了關(guān)于C++強(qiáng)制類型轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

一說起強(qiáng)制類型轉(zhuǎn)換大家都很熟悉,相信很多學(xué)習(xí)完C++的朋友還在使用C語(yǔ)言的強(qiáng)制類型的方式 (類型)變量.

C++其實(shí)也具有自己的一套強(qiáng)制類型轉(zhuǎn)換它們分明是:static_cast  reinterpret_cast  const_cast  dynamic_cast四種類型.

那么肯定會(huì)有人好奇C++是不是閑,C語(yǔ)言的強(qiáng)制類型用的舒舒服服的,為什么要新推出來這幾個(gè)?

新類型的強(qiáng)制轉(zhuǎn)換可以提供更好的控制強(qiáng)制轉(zhuǎn)換過程,允許控制各種不同種類的強(qiáng)制轉(zhuǎn)換。C++中風(fēng)格是static_cast<type>。C++風(fēng)格的強(qiáng)制轉(zhuǎn)換其他的好處是,它們能更清晰的表明它們要干什么。程序員只要掃一眼這樣的代碼,就能立即知道一個(gè)強(qiáng)制轉(zhuǎn)換的目

的。

static_cast                                                                                              

static_cast用于非多態(tài)類型的轉(zhuǎn)換(靜態(tài)轉(zhuǎn)換),任何標(biāo)準(zhǔn)轉(zhuǎn)換都可以用它,但它不能用于兩個(gè)不相關(guān)的類型進(jìn)行轉(zhuǎn)換.

何為不相關(guān)類型? 比如int 和 double char short就是相關(guān)類型. 和int*就是不相關(guān)類型.

我們來看一看static_cast的用法.  例如,通過將一個(gè)運(yùn)算對(duì)象強(qiáng)制轉(zhuǎn)換成double類型就能使表達(dá)式執(zhí)行浮點(diǎn)數(shù)除法:

  double slope = static_cast<double>(j) / i;

當(dāng)static_cast需要把一個(gè)較大的算術(shù)類型賦值給較小的類型時(shí),static_cast非常有用。此時(shí),強(qiáng)制類型轉(zhuǎn)換告訴程序的讀者和編譯器:我們知道并且不在乎潛在的精度損失。一般來說,如果編譯器發(fā)現(xiàn)一個(gè)的算術(shù)類型試圖賦值給較小的類型,就會(huì)給出警告信息;但是當(dāng)我們執(zhí)行了顯式的類型轉(zhuǎn)換后,警告信息就會(huì)被關(guān)閉了。

reinterpret_cast                                                                                        

reinterpret_cast有著和C風(fēng)格的強(qiáng)制轉(zhuǎn)換同樣的能力。它可以轉(zhuǎn)化任何內(nèi)置的數(shù)據(jù)類型為其他任何的數(shù)據(jù)類型,也可以轉(zhuǎn)化任何指針類型為其他的類型。它甚至可以轉(zhuǎn)化內(nèi)置的數(shù)據(jù)類型為指針,無須考慮類型安全或者常量的情形。不到萬不得已絕對(duì)用。

因?yàn)閞einterpret_cast是一個(gè)蠻bug的操作,下面我來演示一下.

typedef void (* FUNC)(); 
int DoSomething (int i) 
{ 
  cout<<"DoSomething" <<endl; 
  return 0; 
} 
void Test () 
{ 
  // reinterpret_cast可以編譯器以FUNC的定義方式去看待 DoSomething函數(shù) 
  // 所以非常的BUG,下面轉(zhuǎn)換函數(shù)指針的代碼是不可移植的,所以不建議這樣用 
  // C++不保證所有的函數(shù)指針都被一樣的使用,所以這樣用有時(shí)會(huì)產(chǎn)生不確定的結(jié)果 
  FUNC f = reinterpret_cast< FUNC>(DoSomething ); 
  f(); 
} 

當(dāng)你這樣運(yùn)行的時(shí)候,你會(huì)發(fā)現(xiàn)通過函數(shù)指針沒有傳參數(shù)調(diào)用這個(gè)有參數(shù)的函數(shù)居然可以調(diào)用,這就很尷尬了,所以我告訴你不到萬不得已就不要使用reinterpret_cast

const_cast

對(duì)于將常量對(duì)象轉(zhuǎn)化為非常量對(duì)象的行為,我們一般稱之為“去掉const性質(zhì)”。一旦我們?nèi)サ袅四硞€(gè)對(duì)象的const性質(zhì),編譯器就不再阻止我們對(duì)該對(duì)象進(jìn)行寫操作了。如果對(duì)象本身不是一個(gè)常量,使用強(qiáng)制類型轉(zhuǎn)換獲得寫權(quán)限是合法的行為。然而如果對(duì)象是一個(gè)常量,再使用const_cast執(zhí)行寫操作就會(huì)產(chǎn)生未定義的后果。

舉個(gè)例子:

#include<iostream> 
#include<Windows.h> 
#include<assert.h> 
 
using namespace std; 
 
int main() 
{ 
 const int a = 2; 
 int *p = const_cast<int*>(&a); 
 *p = 3; 
 cout << a << endl; 
 system("pause"); 
 return 0; 
} 

我們有理由的認(rèn)為在內(nèi)存當(dāng)中a的值被修改為3,但是結(jié)果呢? 我們來看一看

這不科學(xué)啊?? 我們?cè)俅蜷_監(jiān)視窗口看一下a的值.

我們都知道監(jiān)視窗口看到的都是從內(nèi)存當(dāng)中拿到的,但是為什么內(nèi)存當(dāng)中為3,打印出來就是2呢? 我來解釋一下.

C++編譯器具有優(yōu)化功能,當(dāng)你定一個(gè)const的常量的時(shí)候,系統(tǒng)覺得它不會(huì)被改變了,于是做一個(gè)優(yōu)化把該常量存到寄存器當(dāng)中,下次訪問的過程更快速一點(diǎn). 所以當(dāng)顯示窗口讀取數(shù)據(jù)的時(shí)候,他會(huì)直接去寄存器當(dāng)中讀取數(shù)據(jù).而不是去內(nèi)存,所以導(dǎo)致我們明明該掉了a的值,卻打印不出來,但是如何解決這個(gè)問題呢??

c++有一個(gè)關(guān)鍵字: volatile 該關(guān)鍵字的作用防止編譯器優(yōu)化,這個(gè)時(shí)候要輸出a就會(huì)老老實(shí)實(shí)的回內(nèi)存去查看.

#include<iostream> 
#include<Windows.h> 
#include<assert.h> 
 
using namespace std; 
 
int main() 
{ 
 volatile const int a = 2; 
 int *p = const_cast<int*>(&a); 
 *p = 3; 
 cout << a << endl; 
 system("pause"); 
 return 0; 
} 

dynamic_cast                                                                                           

前三種的強(qiáng)制類型轉(zhuǎn)換,他們能做到的C語(yǔ)言的強(qiáng)制類型轉(zhuǎn)換也大多能做到,最后一種C語(yǔ)言的強(qiáng)制類型轉(zhuǎn)換就沒有辦法了.

在類的轉(zhuǎn)換時(shí),在類層次間進(jìn)行上行轉(zhuǎn)換時(shí),dynamic_cast和static_cast的效果是一樣的。在進(jìn)行下行轉(zhuǎn)換時(shí),dynamic_cast具有類型檢查的功能,比static_cast更安全。當(dāng)用于多態(tài)類型時(shí),它允許任意的隱式類型轉(zhuǎn)換以及相反過程. 不過,與static_cast不同,在后一種情況里(注:即隱式轉(zhuǎn)換的相反過程),dynamic_cast 會(huì)檢查操作是否有效. 也就是說, 它會(huì)檢查轉(zhuǎn)換是否會(huì)返回一個(gè)被請(qǐng)求的有效的完整對(duì)象。檢測(cè)在運(yùn)行時(shí)進(jìn)行. 如果被轉(zhuǎn)換的指針不是一個(gè)被請(qǐng)求的有效完整的對(duì)象指針,返回值為NULL. 對(duì)于引用 類型,會(huì)拋出bad_cast異常

你說這個(gè)強(qiáng)轉(zhuǎn)有啥用,其實(shí)對(duì)于我這種菜鳥還真的沒用過,不過我知道一個(gè)問題可以使用這樣的方法解決. 給你兩個(gè)類讓你分辨那個(gè)是子類那個(gè)是父類,我們來看看是如何解決的.

#include<iostream> 
#include<Windows.h> 
#include<assert.h> 
 
using namespace std; 
 
class AA 
{ 
public: 
 
 virtual void fun1() 
 { 
  cout << "hehe" << endl; 
 } 
public: 
 int a; 
}; 
 
class BB :public AA 
{ 
public: 
 
 virtual void fun1() 
 { 
  cout << "heh2e" << endl; 
 } 
public: 
 int c; 
}; 
int main() 
{ 
 AA* q = new AA(); 
 BB* p = new BB(); 
 AA* a; 
 BB* b; 
 
 b = dynamic_cast<BB*>(q); 
 if (b == NULL) 
 { 
  cout << "AA為基類" << endl; 
 } 
 else{ 
  cout << "AA為子類" << endl; 
 } 
 
 a = dynamic_cast<AA*>(p); 
 if (a == NULL) 
 { 
  cout << "BB為基類" << endl; 
 } 
 else 
 { 
  cout << "BB為子類" << endl; 
 } 
 system("pause"); 
 return 0; 
} 

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(130.包圍區(qū)域)

    C++實(shí)現(xiàn)LeetCode(130.包圍區(qū)域)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(130.包圍區(qū)域),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++從匯編的視角審視對(duì)象的創(chuàng)建問題

    C++從匯編的視角審視對(duì)象的創(chuàng)建問題

    這篇文章主要介紹了C++從匯編的視角看對(duì)象的創(chuàng)建,從匯編的視角來看,調(diào)用構(gòu)造器和調(diào)用 “返回對(duì)象” 的函數(shù)是一樣的,從匯編的角度來看,對(duì)象就是一堆數(shù)據(jù)的排列,比如說最普通的對(duì)象就是數(shù)據(jù)成員按照聲明順序直接排列,需要的朋友可以參考下
    2022-01-01
  • C++野指針的具體實(shí)現(xiàn)

    C++野指針的具體實(shí)現(xiàn)

    野指針就是指針指向的不是一個(gè)有效(合法)的地址,本文主要介紹了C++野指針的具體實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • c++雙向鏈表操作示例(創(chuàng)建雙向鏈、雙向鏈表中查找數(shù)據(jù)、插入數(shù)據(jù)等)

    c++雙向鏈表操作示例(創(chuàng)建雙向鏈、雙向鏈表中查找數(shù)據(jù)、插入數(shù)據(jù)等)

    這篇文章主要介紹了c++雙向鏈表操作示例,包括創(chuàng)建雙向鏈、刪除雙向鏈表、雙向鏈表中查找數(shù)據(jù)、插入數(shù)據(jù)等,需要的朋友可以參考下
    2014-05-05
  • C語(yǔ)言代碼實(shí)現(xiàn)2048游戲

    C語(yǔ)言代碼實(shí)現(xiàn)2048游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)2048游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C語(yǔ)言的strcpy函數(shù)你了解嗎

    C語(yǔ)言的strcpy函數(shù)你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的strcpy函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)對(duì)文件進(jìn)行操作的示例詳解

    C語(yǔ)言實(shí)現(xiàn)對(duì)文件進(jìn)行操作的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)對(duì)文件進(jìn)行操作的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定的幫助,需要的可以參考一下
    2023-04-04
  • c++ Qt信號(hào)槽原理

    c++ Qt信號(hào)槽原理

    這篇文章主要介紹了c++ Qt信號(hào)槽原理的相關(guān)資料,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-02-02
  • C++的靜態(tài)成員變量和靜態(tài)成員函數(shù)你了解多少

    C++的靜態(tài)成員變量和靜態(tài)成員函數(shù)你了解多少

    這篇文章主要為大家詳細(xì)介紹了C++的靜態(tài)成員變量和靜態(tài)成員函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語(yǔ)言實(shí)現(xiàn)惡作劇關(guān)機(jī)程序

    C語(yǔ)言實(shí)現(xiàn)惡作劇關(guān)機(jī)程序

    大家好,本篇文章主要講的是C語(yǔ)言實(shí)現(xiàn)惡作劇關(guān)機(jī)程序,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01

最新評(píng)論