0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++之類型轉(zhuǎn)換函數(shù)詳解

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2020-12-24 15:31 ? 次閱讀

一、轉(zhuǎn)換構(gòu)造函數(shù)的學(xué)習(xí):

1、回憶數(shù)據(jù)類型轉(zhuǎn)換:

在平時寫代碼的時候,最怕的就是那種隱式數(shù)據(jù)類型轉(zhuǎn)換了,一不小心,軟件就bug不斷;而顯示數(shù)據(jù)類型(一般是程序自己去強制類型轉(zhuǎn)換,這個是我們能夠明顯的識別和掌控的)。為此我們這里總結(jié)了一副隱式類型轉(zhuǎn)換的圖:

下面我們來幾個隱式轉(zhuǎn)換的例子:

代碼版本一:

#include <iostream>
#include <string>
int main()

short s ='a';
unsigned int ui = 100;
int i = -200;
double d = i;
std::cout<<"d =" << d <<std::endl;
std::cout<<"ui= "<<ui<<std::endl;
if((ui+i)>0)

std::cout<<"Postive"<<std::endl;

else

std::cout<<"Negative"<<std::endl;

return 0;

輸出結(jié)果:

root@txp-virtual-machine:/home/txp# ./a.out
d =-200
ui= 100
Postive

注解:這里我們明顯發(fā)現(xiàn)(-200+100)還是大于0,這顯然不符合正常人的思維了;所以我們仔細分析一下,發(fā)現(xiàn)這里肯定是進行了隱式轉(zhuǎn)換了,為此我們再加一條語句看看(ui+i)的值到底是多少:

代碼版本二:

#include <iostream>
#include <string>
int main()

short s ='a';
unsigned int ui = 100;
int i = -200;
double d = i;
std::cout<<"d =" << d <<std::endl;
std::cout<<"ui= "<<ui<<std::endl;
if((ui+i)>0)

std::cout<<"(ui+i) = "<<ui+i<<std::endl;
std::cout<<"Postive"<<std::endl;

else

std::cout<<"Negative"<<std::endl;

return 0;

輸出結(jié)果:

root@txp-virtual-machine:/home/txp# ./a.out
d =-200
ui= 100
(ui+i) = 4294967196
Postive

注解:通過打印(ui+i)的值我們發(fā)現(xiàn),i原本是int數(shù)據(jù)類型,這里隱式轉(zhuǎn)換成無符號的數(shù)據(jù)類型了

為了讓大家更加理解隱式的轉(zhuǎn)換,我們下面再來一個例子:

代碼版本三:

#include <iostream>
#include <string>
int main()

short s ='a';
unsigned int ui = 100;
int i = -200;
double d = i;
std::cout<<"d =" << d <<std::endl;
std::cout<<"ui= "<<ui<<std::endl;
if((ui+i)>0)

std::cout<<"(ui+i) = "<<ui+i<<std::endl;
std::cout<<"Postive"<<std::endl;

else

std::cout<<"Negative"<<std::endl;

std::cout<<"sizeof(s+'b') = "<<sizeof(s+'b')<<std::endl;
return 0;

輸出結(jié)果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp# ./a.out
d =-200
ui= 100
(ui+i) = 4294967196
Postive
sizeof(s+'b') = 4

注解:這里我們發(fā)現(xiàn)sizeof出來的內(nèi)存大小是4個字節(jié)大?。黄鋵嵾@里編譯器把short和char類型的都轉(zhuǎn)換int類型了,所以最終兩個int數(shù)據(jù)相加,所占的內(nèi)存大小就是int類型了。

所以咋們平時在寫代碼的時候,腦袋里面要有這種寫代碼謹慎的思維,防止出現(xiàn)這種隱式轉(zhuǎn)換的情況出現(xiàn),養(yǎng)成寫代碼的好習(xí)慣

2、普通類型與類類型之間能否進行類型轉(zhuǎn)換,類類型之間又是否能夠類型轉(zhuǎn)換呢?

為了說明這些問題,咋們通過實際的代碼測試來看看啥情況:

代碼:普通類型轉(zhuǎn)換成類類型

#include <iostream>
#include <string>
class Test{
public
Test()


Test(int i)


};
int main()

Test t;
t =6; 從 C 語言角度,這里將 5 強制類型轉(zhuǎn)換到 Test 類型,只不過編譯器 在這里做了隱式類型轉(zhuǎn)換
return 0;

輸出結(jié)果(顯示可以編譯通過)

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp# ./a.out

代碼類類型轉(zhuǎn)換為普通類型

#include <iostream>
#include <string>
class Test{
public:
Test()


Test(int i)


};
int main()

Test t;
int i = t;
return 0;

輸出結(jié)果(沒有編譯通過)

root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:21:14: error: cannot convert ‘Test’ to ‘int’ in initialization
int i = t;

代碼類類型與類類型之間的轉(zhuǎn)換:

#include <iostream>
#include <string>
class Value{
};
class Test{
public:
Test()


Test(int i)


};
int main()

Test t;
Value i;
t=i;
return 0;

輸出結(jié)果(暫時還是不行,編譯不通過):

root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:27:7: error: no match for ‘operator=’ (operand types are ‘Test’ and ‘Value’)
t=i;

test.cpp:27:7: note: candidate is:
test.cpp:9:7: note: Test& Test::operator=(const Test&)
class Test{

test.cpp:9:7: note: no known conversion for argument 1 from ‘Value’ to ‘const Test&’

說明:上面的例子,我們只是簡單的按照實際角度出發(fā),發(fā)現(xiàn)確實有寫轉(zhuǎn)換行不通。那么真理到底是怎樣的?我們接著往下看

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 可編程邏輯
    +關(guān)注

    關(guān)注

    7

    文章

    514

    瀏覽量

    44009
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73302
收藏 人收藏

    評論

    相關(guān)推薦

    C++中實現(xiàn)類似instanceof的方法

    函數(shù),可實際上C++中沒有。但是別著急,其實C++中有兩種簡單的方法可以實現(xiàn)類似Java中的instanceof的功能。 在 C++ 中,確定對象的
    的頭像 發(fā)表于 07-18 10:16 ?355次閱讀
    <b class='flag-5'>C++</b>中實現(xiàn)類似instanceof的方法

    FX2 CY7C68013A如何在C++環(huán)境中使用LoadEEPROM函數(shù)

    我使用的是 FX2 CY7C68013A 芯片。 我知道 CyUSB.NET 庫中有我需要的 LoadEEPROM 函數(shù)。 請問如何在 C++ 環(huán)境而不是 C#/CLR 環(huán)境中使用該
    發(fā)表于 05-31 06:59

    C語言如何掌握強制類型轉(zhuǎn)換的精髓

    強制類型轉(zhuǎn)換是把變量從一種類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。例如,如果您想存儲一個 long 類型的值到
    的頭像 發(fā)表于 02-26 11:00 ?386次閱讀
    <b class='flag-5'>C</b>語言如何掌握強制<b class='flag-5'>類型</b><b class='flag-5'>轉(zhuǎn)換</b>的精髓

    c語言,c++,java,python區(qū)別

    C語言、C++、Java和Python是四種常見的編程語言,各有優(yōu)點和特點。 C語言: C語言是一種面向過程的編程語言。它具有底層的特性,能夠?qū)τ嬎銠C硬件進行直接操作。
    的頭像 發(fā)表于 02-05 14:11 ?1366次閱讀

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個版本,來了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發(fā)表于 01-11 09:00 ?427次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的

    基于C/C++面向?qū)ο蟮姆绞椒庋bsocket通信類

    在掌握了基于 TCP 的套接字通信流程之后,為了方便使用,提高編碼效率,可以對通信操作進行封裝,本著有淺入深的原則,先基于 C 語言進行面向過程的函數(shù)封裝,然后再基于 C++ 進行面向?qū)ο蟮念惙庋b。
    的頭像 發(fā)表于 12-26 09:57 ?1140次閱讀

    C語言和C++中那些不同的地方

    C語言雖說經(jīng)常和C++在一起被大家提起,但可千萬不要以為它們是一個東西?,F(xiàn)在我們常用的C語言是C89標(biāo)準(zhǔn),C++
    的頭像 發(fā)表于 12-07 14:29 ?773次閱讀
    <b class='flag-5'>C</b>語言和<b class='flag-5'>C++</b>中那些不同的地方

    c++怎么開始編程

    C++是一種高級的、通用的編程語言,用于開發(fā)各種類型的應(yīng)用程序。它是從C語言演變而來,也是一種靜態(tài)類型語言,可以在不同的平臺上進行開發(fā)。C++
    的頭像 發(fā)表于 11-27 15:56 ?737次閱讀

    CLOB類型的數(shù)據(jù)轉(zhuǎn)換為VARCHAR類型

    VARCHAR字段則適用于存儲小于或等于某個長度的字符數(shù)據(jù)。當(dāng)我們需要將CLOB類型的數(shù)據(jù)轉(zhuǎn)換為VARCHAR類型時,可以使用以下方法: 使用數(shù)據(jù)庫函數(shù):不同的數(shù)據(jù)庫系統(tǒng)提供了不同的
    的頭像 發(fā)表于 11-21 10:39 ?4509次閱讀

    探索C++的編程習(xí)慣與編程要點

    C++的類可以分為帶指針數(shù)據(jù)成員與不帶指針數(shù)據(jù)成員兩類,complex就屬于不帶指針成員的類。而這里要說的字符串類String,一般的實現(xiàn)會帶有一個char *指針。帶指針數(shù)據(jù)成員的類,需要自己實現(xiàn)class三大件:拷貝構(gòu)造函數(shù)、拷貝賦值
    的頭像 發(fā)表于 11-14 09:25 ?329次閱讀
    探索<b class='flag-5'>C++</b>的編程習(xí)慣與編程要點

    什么是C++函數(shù)? 應(yīng)該怎么定義? 用途是什么?

    什么是C++函數(shù)? 應(yīng)該怎么定義? 主要用途是什么?
    發(fā)表于 11-08 06:58

    如何綁架C語言標(biāo)準(zhǔn)庫函數(shù)?

    C語言動態(tài)內(nèi)存可以使用 malloc 標(biāo)準(zhǔn)庫函數(shù),而 C++ 會使用 new 關(guān)鍵字申請,裸機情況下一般沒有問題,但是在 RTOS 情況下,就需要考慮資源保護的情況,比如多個任務(wù)同時
    發(fā)表于 11-01 09:50 ?385次閱讀

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點問題,讓大家領(lǐng)略現(xiàn)代C++之美,掌握其中的精髓,更好地使用C++,C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《C++之旅》!
    的頭像 發(fā)表于 10-30 16:35 ?697次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖

    函數(shù)類型函數(shù)指針類型的區(qū)別

    平時用的更多的是函數(shù)指針類型,比如作為函數(shù)參數(shù)傳入回調(diào)函數(shù)等等。實際上函數(shù)類型也是可以作為
    發(fā)表于 10-24 14:27 ?281次閱讀

    C++程序設(shè)計精簡版

    總 目 錄第 1 篇 基 本 知 識 第 1 章 C++的初步知識第 2 章 數(shù)據(jù)類型與表達式 第 2 篇 面向過程的程序設(shè)計第 3 章 程序設(shè)計初步第 4 章 函數(shù)與預(yù)處理第 5 章 數(shù)組第 6
    發(fā)表于 10-09 07:26