分類

展開全部 | 收合全部

分類

展開全部 | 收合全部

【草稿】【Modern C++ #2】 C++ 轉型 casting 整理 (C-style cast, static_cast, dynamic_cast, reinterpret_cast, const_cast)

前言

此文章目前尚未整理完成,如需學習完整內容可參考隨附的 reference,或自行 google 搜尋
但因為作者要整理的筆記太多,如果想早點看到整理後的文章,可以下方留言「期待整理」之類的… 我會努力找時間優先整理!

casting 就是轉型的意思,這篇文章讓我們來整理一些 C, C++ 一些相關的概念

C-style cast (Regular Cast)

C 語言的轉型,格式是 (int) a,
透過 () 包住 type,
可以將後者變數轉型成 () 中的 type。

在 C++ 中,這種語法包含了 const_cast, static_cast, reinterpret_cast,不過也因此這種轉型不見得安全(下方有說明),因為他沒有採取比較安全的 dynamic_cast,可能會出現不預期的轉型(或說是語意混淆 ambiguous),因此使用時必須要小心。

缺點? 其實是因為從 C 到了 C++

C 語言能夠轉型的方式只有一種,但到了 C++ 後,出現了物件導向的「繼承」、「模版」概念
這在 C 上單純轉型的行為,可能開始會有語意混淆 (ambiguous),
而這時 compiler 的預設行為是「照著某個順序嘗試」,天啊,嘗試聽起來就可能突然哪天會出事啊!
當然,大部分情況可能沒差,但一個嚴謹的程式設計,
又特別是撰寫 C++ (相比 python),對這種小細節我們當然必須要求。

也因此後來才會出現了我們以下要介紹的 static_cast, dynamic_cast, reinterpret_cast, const_cast

介紹一下從 C++ 開始要處理的問題

如果我們把各種轉型的情況列出來,大致有以下幾種可能:

此部分參考原文翻譯,翻譯能力有限,建議英文不錯的也可以閱讀原文:
1. How do you explain the differences among static_cast, reinterpret_cast, const_cast, and dynamic_cast to a new C++ programmer?
2. Regular cast vs. static_cast vs. dynamic_cast in C++
3. When should static_cast, dynamic_cast, const_cast, and reinterpret_cast be used?

  • 兩個可運算的 type
  • 把運算 type 轉成 pointer type
  • 兩個 pointer type 的轉換

C-style cast (Regular Cast) 範例程式碼

#include <iostream>

int main(){
    double a = 1.5;
    int b = (int) 1.5;
    std::cout << b << std::endl;
    std::cout << &a << std::endl;
    std::cout << (int) a << std::endl;
    std::cout << (float) a << std::endl;
    return 0;
}
  • 結果:

就是單純的轉型

static_cast

最基本的型態轉換,屬於強制轉型
常用於 float -> int,char -> int

dynamic_cast

dynamic_cast 最常被使用來處理多型 (polymorphism) 的問題,當我們要轉型至「被繼承的 class」才需要使用, dynamic_cast只被使用於 cast from “base class” to “derived class”.

reinterpret_cast

reinterpret_cast 是最危險的 casting,使用時最需要小心,他的強制轉型有可能會出現我們完全預期的結果。
使用於重新解讀比較 low level 的情況,(舉例像是 bit patterns),
最主要的使用情況是將 raw data bit stream 轉換為實際可以使用的資料,或將資料儲存為 low bits,並使用 pointer 指向這些資料。

const_cast

當我們要對一個 variable 新增/移除 const 時使用,
理解上,建議理解 「const type」 與 「type」 是不同的 type,
會比較不容易出現 casting 的問題。

Reference

⭐C++ 基礎用法 相關文章整理⭐:
1.【C++】C++ compile 程式碼 使用 c++ 11 與使用相關的 package
2.【C++】C/C++ 顯示資料的類別 (type) sample code (內含範例程式碼) print C data type, cout C++ data type, get variable type in c++
3.【C++】C++ 複製 2D array的方法 copy 2d array memcpy sample code (內含範例程式碼)
⭐Modern C++ ⭐:
⭐C++ 字串處理相關文章整理⭐:
1.【C++】字串 char string stringstream 相關用法總整理 (內含範例程式碼) 與利用 sprinf, snprinf assign 值的方法
2.【C++】字串 char string stringstream 「轉換」用法總整理 (內含範例程式碼)
3.【C】printf, fprintf, sprintf, snprintf 相關用法總整理 (內含範例程式碼)
4.【C++】C++ String 用法 連接兩個 String c++ string concat
⭐C++ 系統偵測相關文章整理⭐:
1.【C++】C++ 利用 dirent.h 計算資料夾的檔案數量 count files sample code (內含範例程式碼)
2.【C++】C++ inotify sample code 偵測指定路徑底下的文件變化 (內有範例程式碼)
⭐C++ OpenCV 相關文章整理⭐:
1.【OpenCV】c++ OpenCV – 在 ubuntu 上第一次執行 OpenCV 程式 sample code (內含範例程式碼)
2.【OpenCV】c++ OpenCV - 在圖片上寫上文字 cv::putText sample code (內含範例程式碼)
3.【OpenCV】c++ OpenCV - cv::Rect 矩形用法與相關功能函數 sample code (內含範例程式碼)
4.【OpenCV】c++ OpenCV - OpenCV 中的純量 定義顏色 cv::Scalar(255,255,255) color sample code (內含範例程式碼)
5.【OpenCV】用 C++ 計算 iou 的方法 與網路算法常見錯誤(內附範例程式碼) sample code
⭐C++ Makefile 相關文章整理⭐:
1.【C++ Makefile】- 1 / 嘗試撰寫自己的第一份 Makefile
2.【C++ Makefile】- 2 / 新增自己的變數
3.【C++ Makefile】- 3 / Makefile 常用變數 -「$@」, 「$^」
4.【C++ Makefile】- 4 / Makefile 常用 fake target -「.PHONY」
5.【C++ Makefile】- 5 / Makefile 內建變數 -「$@」, 「$^」, 「$<」, 「$* 」,「$? 」
⭐【喜歡我的文章嗎? 歡迎幫我按讚~ 讓基金會請創作者喝一杯咖啡!
如果喜歡我的文章,請幫我在下方【按五下Like】 (Google, Facebook 免註冊),會由 「LikeCoin」 贊助作者鼓勵繼續創作,讀者們「只需幫忙按讚,完全不用出錢」哦!

likecoin-steps
Howard Weng
Howard Weng

我是 Howard Weng,很多人叫我嗡嗡。這個網站放了我的各種筆記。希望這些筆記也能順便幫助到有需要的人們!如果文章有幫助到你的話,歡迎幫我點讚哦!
另外,因為定位是「個人的隨手筆記」,有些文章內容「⚠️可能我理解有誤⚠️」或「?只寫到一半?」,如果有發現這樣的情況,歡迎在該文章的最下面留言提醒我!我會儘快修正或補上!感謝大家的建議與幫忙,讓網站能變得更好?

文章: 889

★留個言吧!內容有誤或想要補充也歡迎與我討論!