記住這個,能少走彎路,C++兩種隱式類型轉換

2021-01-10 軟體技術分享

採用C++進行程序開發的過程中,難免會遇到各種各樣莫名其妙的問題,而有些問題只有了解了其用法和原理之後,才能避免在工作中犯錯誤。

本文將要講解的C++兩種隱式類型轉換,如果不了解其用法,那麼遇到問題的時候,可能就會陷入困境。

所以接下來就來講解operator與構造函數的隱式類型轉換,首先通過例子說明operator的隱式類型轉換,再說明構造函數的隱式類型轉換,最後再總結它們之間的區別。

一、 operator隱式類型轉換

operator除了操作符的重載之外,還有隱式類型轉換的功能。operator隱式類型轉換是指隱式將當前對象生成其他類型的對象。

為了說明operator的隱式類型轉換,首先實現ObjectA對象, 形如operator int的聲明即為operator的隱式類型,而轉換的類型為整型int。

1、主程序輸入如下代碼段,先創建ObjectA類型的對象objA,然後將該對象變量objA與整型數字4相加。

2、從 調試運行輸出的結果看,ObjA雖然不是int類型,但是與整數類型4進行相加的時候,會調用到operator int函數,該函數返回的結果是int類型

二、構造函數的隱式類型轉換

構造函數的隱式類型轉換,是用其他類型來構造當前類型的臨時對象。

為了說明構造函數的隱式類型轉換,需要實現ObjectB類,該類實現了一個無參數構造函數、一個參數類型為ObjectA的構造函數,一個析構函數和列印函數,注意入參類型是ObjectB。

1、主程序中輸入如下代碼段, 創建ObjectA類型的對象objA,主要用於說明後面構造函數隱式類型的轉換,接著創建ObjectB類型的對象objB,最後調用該對象的列印函數print,但是入參類型為ObjectA。

2、 從調試運行輸出結果看,print函數聲明的入參類型是ObjectB, 但是傳遞的類型是ObjectA,但是由於ObjectB有單一形參類型為ObjectA的構造函數,程序會隱式地將objA轉換為ObjectB(objA)

3、 如果想禁用構造函數的隱式類型轉換,那麼構造函數前添加explicit 即可,例如:

三、總結

本文主要通過例子講解了opertor隱式類型與構造函數隱式類型的用法,C++提供了這樣的機制,必然有其合理性,正所謂存在即合理,但是,開發過程中,如果不注意的話,也會帶來很多不必要的麻煩,因此,對其有一個整體的概念的理解,能夠在開發過程中,給予一個警惕的作用。最後再來梳理下兩種隱式類型轉換的區別。

operator的隱式類型轉換是將當前對象生成其他類型的對象。構造函數的隱式類型轉換,是用其他類型來構造當前類型的臨時對象operator的隱式類型轉換與構造函數的隱式類型轉換是相反的。

相關焦點

  • C++的轉換手段並與explicit關鍵詞配合使用
    ++作者:良知猶存轉載授權以及圍觀:歡迎添加微信公眾號:羽林君隱式轉化c++語言不會直接將兩個不同類型的值相加,二十先根據類型轉化規則設法將運算對象的類型統一後再求值。例如 int value = 3.14 +3;這個程序是可以編譯通過的,只不過編譯器可能會警告改運算損失了精度。
  • 誰說C++ 的強制類型轉換很難懂?
    作者 | 櫻雨樓責編 | 屠敏在上篇與中篇中,我們討論了隱式類型轉換及其與函數重載之間的相關話題。本篇將要討論的即為類型轉換的另一大分支——強制類型轉換。C風格的強制類型轉換在C語言中,強制類型轉換存在兩種等價形式:Type(Value)或(Type)Value。
  • 2.5 JavaScript數據類型的轉換
    JavaScript是一種弱類型的程式語言,使用時無須指定數據類型。但在對表達式進行求值時,通常需要所有的操作數都屬於某種特定的數據類型。例如,進行算術運算時要求操作數都是數值類型,進行字符串連接運算時要求操作數都是字符串類型,而進行邏輯運算時則要求操作數都是布爾類型,這就需要數據類型之間的轉換。
  • C++開發必看 四種強制類型轉換的總結
    【IT168 技術】C風格的強制類型轉換(Type Cast)很簡單,不管什麼類型的轉換統統是:  C++風格的類型轉換提供了4種類型轉換操作符來應對不同場合的應用。  const_cast,字面上理解就是去const屬性。  static_cast,命名上理解是靜態類型轉換。
  • 柯潔:李世石僥倖贏了AlphaGo AI能幫人類少走彎路
    網易體育7月10日報導:北京時間7月10日,圍棋世界冠軍柯潔接受採訪時再次談到了人工智慧,在柯潔看來,AI曲線上升的速度遠超人類,人類棋手雖然無法超越AI,但可以通過人工智慧來幫助自己無限縮短走彎路時間。
  • 82條AD轉換設計經驗,讓你少走彎路!
    13、想設計高精度校準儀表,如直流電壓輸出(毫伏級),能不能推薦幾款晶片?請問怎樣消除伴隨的量化噪聲?如何保證ADC的精度,AD轉換的滿量程即是電源電壓,對於單電源供電,零點的確定和量程都與電源電壓有關,如果電源電壓波動勢必導致轉換的誤差,電路中如何解決,特別對小信號的採集.請問什麼是DAC的輸出靜態誤差?
  • EDA365:82條AD轉換設計經驗,讓你少走彎路!
    這是一篇關於AD轉換設計中的基本問題好文,幫助大家更好的了解數據轉換器錯誤及參數。1、如何選擇高速模數轉換之前的信號調理器件;如何解決多路模數轉換的同步問題?ADC之前的信號調理,最根本的原則就是信號調理引起的噪聲和誤差要在ADC的1個LSB之內。根據這個目的,可以需要選擇指標合適的運放。
  • 【C++】C++獲取系統日期時間
    可以調用ctime()函數進行時間轉換輸出:char * ctime(const time_t *timer);將日曆時間轉換成本地時間,按年月日格式,進行輸出,如:Wed Sep 23 08:43:03 2015C語言還提供了將秒數轉換成相應的時間結構的函數:struct tm * gmtime(const time_t *timer);
  • 基於Matlab和Visual C++的數字濾波器設計方法
    每一次只改變其中的某一個因素,而控制其餘幾個因素不變,從而研究被改變的這個因素對事物的影響,分別加以研究,最後再綜合解決,這種方法叫控制變量法,被廣泛地運用在各種科學研究之中。得到傳遞函數後,就可以對信號進行濾波。由於待處理的數據是數位訊號,若想仿真需將頻域的傳遞函數轉換為x域的傳遞函數,即將模擬濾波器轉換為數字濾波器。
  • 深度圖像識別-深層網絡的隱式語義數據擴增 ISDA 方法
    不幸的是,這個過程在計算上是密集的,因為訓練生成模型並推斷它們以獲得增強樣本是不簡單的任務。此外,由於數據量的增加,訓練過程也可能會延長。vZVEETC-電子工程專輯本文提出了一種用於訓練深度圖像識別網絡的隱式語義數據擴增(ISDA)算法。ISDA 是高效的,因為它不需要訓練/推斷輔助網絡或顯式地生成額外的訓練樣本。
  • 靶向藥的5個副作用、三大條件,提前了解,才能少走彎路
    靶向藥的5個副作用、三大條件,提前了解,才能少走彎路 目前靶向藥種類眾多不過這個副作用在停藥或者減少藥物攝取量後會緩解,不用擔心。 3、心臟毒性 靶向藥還會引發一系列的心血管毒性,一般會出現心肌缺血、心肌梗死、高血壓等症狀,原本就有心臟病的患者在服用靶向藥時,需要特別注意。
  • 鬼谷子為人處世記住3句話,少走彎路不吃虧
    如鬼谷子就告訴我們,為人處世明白記住3句話,會少走很多彎路不吃,人生也就不會有那麼多的不如意。 1、 相益則親,相損則疏。 說的也就是「人情冷暖」,往往人與人能聚集在一起大多為了利益,才能產生一些共同的話題。但這只是一種表面親近的假象,如有一天遇到了困難,而對方會毫不猶豫地離開。所以,這種關係是不長久的。
  • 標準C+的類型轉換符:static_cast等
    ,它純粹就是一個把括號放在哪的問題,我們把這兩種形式稱為舊風格(old-style)的強制轉型。 二、 C++類型轉換 使用標準C++的類型轉換符,主要有四種類型: static_cast、dynamic_cast、reinterdivt_cast
  • 大數據開發基礎:Java基礎數據類型
    首先,Java八種數據類型,其實可以整合為四大數據類型,分別是:整型(byte、short、int、long)、浮點型(float、double)、字節型(char)、布爾型(boolean)。Java基礎數據類型
  • 單片機進位轉換
    十六 ----> 二 ;二 ----> 十六  二進位和十六進位的互相轉換比較重要。不過這二者的轉換卻不用計算,每個C,C++程式設計師都能做到看見二進位數,直接就能轉換為十六進位數,反之亦然。   我們也一樣,只要學完這一小節,就能做到。
  • 引用數據類型的概念_引用數據類型有哪幾種
    引用類型 由類型的實際值引用(類似於指針)表示的數據類型。如果為某個變量分配一個引用類型,則該變量將引用(或「指向」)原始值。不創建任何副本。引用類型包括類、接口、委託和裝箱值類型。
  • 分享用CAD做設計13年的經驗,希望能讓使用CAD的朋友們能少走彎路
    我今天分享自己13年用CAD做設計的親身經驗,希望能讓正在使用CAD做設計的朋友能少走彎路。做建築、裝修、水、暖、電設計的,不要認為背下多少個快捷鍵,CAD畫圖就一定快了。想畫圖快,背再多的快捷鍵,動作再帥、速度再快,畫圖也是相對比較慢的。
  • 給新手養殖淡水蝦的一點技巧幹貨,讓你少走彎路
    給新手養殖淡水蝦的一點技巧幹貨,讓你少走彎路蝦養殖已經走過了漫長的道路,並已從亞洲和泰國的小規模農場養殖轉變為全球產業。全球養殖的蝦只有少數幾種,其中最受歡迎的物種是羅氏沼蝦,即巨型馬來西亞蝦,它是一種淡水蝦,原產於南亞。今天就給你們講講淡水蝦的養殖。在你開始養蝦場之前首先是要獲取養殖許可證和營業執照,以便在你們所在地區經營商業養蝦場。
  • 實現簡單的單詞計數器的兩種方法
    引言Go中的接口是隱式實現的。只要實現了接口中定義的所有方法,也就實現了該接口。接口可以接收任何類型的變量。比如常用的fmt.Println(a ...interface{}) (n int, err error)方法,這個方法中參數是接口類型,可以把任意的類型值傳給它。
  • C++學習日記 Day4
    構造函數和析構函數分類按照參數分類:有參構造 無參構造(默認構造)按照類型分類:普通構造 拷貝構造 格式:類名(const 類名 & aaa)【注】構造函數的寫法(就是一個初始化的函數)://沒有返回值,也不寫void,函數名與類名相同;//可以有參數,可以發生重載;