日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

const_cast

發布時間:2024/9/30 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 const_cast 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

const_cast用于添加或者刪除指針或者引用的const屬性,但是對于刪除const屬性的功能有一些bug:

可以構造結構體或者類的非const指針或者引用給新變量,但是原變量的const屬性不變化,新變量可以修改對應的內容;但是如果是一個基本類型的const變量,譬如cosnt char *,const int等等,不會修改其內容。

所以,還是應該遵從這樣的原則:使用const_cast去除const限定的目的絕對不是為了修改它的內容(來自:http://www.cnblogs.com/ider/archive/2011/07/22/cpp_cast_operator_part2.html)其中有些觀點很有概括性,譬如:C++對于指針的轉換是任意的,它不會檢查類型,任何指針之間都可以進行互相轉換。int * 可以強制轉換為float*,const int *可以強制轉換為int *,int *可以轉換為char *

以下轉自:http://blog.csdn.net/lwbeyond/article/details/6213382


1. 常量指針被轉化成非常量指針,轉換后指針指向原來的變量(即轉換后的指針地址不變)。

[c-sharp]?view plaincopy
  • class?A??
  • {??
  • public:??
  • ?A()??
  • ?{??
  • ??m_iNum?=?0;??
  • ?}??
  • ??
  • public:??
  • ?int?m_iNum;??
  • };??
  • ??
  • void?foo()??
  • {??
  • ?//1.?指針指向類??
  • ?const?A?*pca1?=?new?A;??
  • ?A?*pa2?=?const_cast<A*>(pca1);??//常量對象轉換為非常量對象??
  • ?pa2->m_iNum?=?200;????//fine??
  • ?//轉換后指針指向原來的對象??
  • ?cout<<?pca1->m_iNum?<<pa2->m_iNum<<endl;?//200?200??
  • ??
  • ?//2.?指針指向基本類型??
  • ?const?int?ica?=?100;??
  • ?int?*?ia?=?const_cast<int?*>(&ica);??
  • ?*ia?=?200;??
  • ?cout<<?*ia?<<ica<<endl;???//200?100??
  • }??

  • 第一個工作正常,但后一個程序不能正常工作!!我繼續嘗試了不同的類型,比如char,short ,float,double等,發現了規律,凡是對結構體或類進行這個轉換,都是成功的,但對char, short等基本類型的轉換都沒有成功。這是為什么呢?反匯編如下:

    反匯編發現,雖然我沒有使用優化,但系統還是對ica這個const進行了預編譯般的替換,將它替換成“64h”(十六進制的64就是十進制的100)。其實ica地址上的值已經變了,這點從ia的輸出可以看出,但由于系統對這個ica進行了預編譯替換,從而導致輸出ica的值沒有變。這算是個C++的bug吧。

    ?

    2. 常量引用被轉換成非常量引用。

    [c-sharp]?view plaincopy
  • class?A??
  • {??
  • public:??
  • ?A()??
  • ?{??
  • ??m_iNum?=?0;??
  • ?}??
  • ??
  • public:??
  • ?int?m_iNum;??
  • };??
  • ??
  • void?foo()??
  • {??
  • ?//1.?指針指向類??
  • ?const?A?*pca1?=?new?A;??
  • ?A?*pa2?=?const_cast<A*>(pca1);??//常量對象轉換為非常量對象??
  • ?pa2->m_iNum?=?200;????//fine??
  • ?//轉換后指針指向原來的對象??
  • ?cout<<?pca1->m_iNum?<<pa2->m_iNum<<endl;?//200?200??
  • ??
  • ?//2.?指針指向基本類型??
  • ?const?int?ica?=?100;??
  • ?int?*?ia?=?const_cast<int?*>(&ica);??
  • ?*ia?=?200;??
  • ?cout<<?*ia?<<ica<<endl;???//200?100,本應該輸入200?200的??
  • }??

  • 同樣有上面那個問題,原因也是一樣的。

    ?

    3. 常量對象(或基本類型)不可以被轉換成非常量對象(或基本類型)。

    [c-sharp]?view plaincopy
  • void?foo()??
  • {??
  • ?//常量對象被轉換成非常量對象時出錯??
  • ?const?A?ca;??
  • ?A?a?=?const_cast<A>(ca);??//不允許??
  • ??
  • ?const?int?i?=?100;??
  • ?int?j?=?const_cast<int>(i);??//不允許??
  • ??
  • }??
  • 記住這種轉換只是開了一個接口,并不是實質上的轉換。(其實也算是實質上的轉換了,只不過表達上不允許這樣寫)

    ?

    4. 添加const屬性

    [c-sharp]?view plaincopy
  • int?main(int?argc,?char?**?argv_)???
  • {??
  • ?int?i?=?100;??
  • ?int?*j?=?&i;??
  • ?const?int?*k?=?const_cast<const?int*>(j);??
  • ?//const?int?*m?=?j;???感覺和這樣寫差不多??
  • ??
  • ?//指的地址都一樣??
  • ?cout?<<i<<","<<&i<<endl;?//100,?0012FF78??
  • ?cout?<<*j<<","<<j<<endl;?//100,?0012FF78??
  • ?cout?<<*k<<","<<k<<endl;?//100,?0012FF78??
  • ??
  • ?*j?=?200;??
  • ?//*k?=?200;???//error??
  • ??
  • ?return?0;??
  • }??

  • 三. 總結:
    1. 使用const_cast去掉const屬性,其實并不是真的改變原類類型(或基本類型)的const屬性,它只
    是又提供了一個接口(指針或引用),使你可以通過這個接口來改變類型的值。也許這也是const_case只能轉換指針或引用的一個原因吧。

    ?

    2. 使用const_case添加const屬性,也是提供了一個接口,來不讓修改其值,不過這個添加const的操作沒有什么實際的用途(也許是我認識太淺了)。

    ?

    3. 從對基本類型(int,char)的輸出來看,使用const_case轉換后的輸出有點像鬧劇!也許const_case只是給編譯器用的。

    ?

    4. 唉,使用const_case可能就是不讓你用const_case?!


    總結

    以上是生活随笔為你收集整理的const_cast的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。