最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++隱式類型轉(zhuǎn)換存在的問題解析

 更新時(shí)間:2022年03月01日 08:22:22   作者:咪啪魔女  
隱式轉(zhuǎn)換,是指不需要用戶干預(yù),編譯器私下進(jìn)行的類型轉(zhuǎn)換行為,很多時(shí)候用戶都不知道具體進(jìn)行了哪些轉(zhuǎn)換,這篇文章主要介紹了c++隱式類型轉(zhuǎn)換存在的陷阱,需要的朋友可以參考下

什么是隱式轉(zhuǎn)換:

c++中的基本類型并非完全對(duì)立,部分類型之間是可以進(jìn)行隱式轉(zhuǎn)換的,所謂隱式轉(zhuǎn)換,是指不需要用戶干預(yù),編譯器私下進(jìn)行的類型轉(zhuǎn)換行為,很多時(shí)候用戶都不知道具體進(jìn)行了哪些轉(zhuǎn)換

為什么要進(jìn)行隱式轉(zhuǎn)換:

隱式轉(zhuǎn)換可以讓程序員在兩個(gè)不同類型的數(shù)據(jù)直接進(jìn)行操作,而不用自行轉(zhuǎn)換類型,隱式轉(zhuǎn)換給程序開發(fā)者帶來了不小的便捷

隱式轉(zhuǎn)換的原則:

  • 基本數(shù)據(jù)類型的轉(zhuǎn)換以取值范圍作為轉(zhuǎn)換基礎(chǔ)(保證精度不丟失)
  • 隱式轉(zhuǎn)換發(fā)生在從小 ——> 大的轉(zhuǎn)換中。如char轉(zhuǎn)換為int,int轉(zhuǎn)換成double

目標(biāo)代碼

旨在弄懂下面的代碼,明確變量a1,a2,a3在創(chuàng)建時(shí)編譯器究竟干了那些事:

#include<iostream>
using namespace std;
class A{
public:
    int x;
    A() {cout<<"A()"<<endl;}
    A(int i) : x(i){cout<<"A(int i)"<<endl;}
    A(const A &ra) : x(ra.x) 
    	{cout<<"A(const A&)"<<endl;}
    void operator=(const A&){cout<<"operator="<<endl;}
};
int main(){
    cout<<"the assignment of a1 : "<<endl;
    A a1;
    a1 = 2;
    cout<<"the copy initialization of a2 : "<<endl;
    A a2 = 2;
    cout<<"the direct initialization of a3 :"<<endl;
    A a3(a1);
    return 0;
}

運(yùn)行結(jié)果:

構(gòu)造函數(shù)定義的隱式類型轉(zhuǎn)換

任何只接受一個(gè)參數(shù)的構(gòu)造函數(shù),都隱式地定義了由該參數(shù)向該類型的隱式類型轉(zhuǎn)換

A(int i)定義了一個(gè)由int向A的隱式類型轉(zhuǎn)換

所以,在任何使用A對(duì)象的地方,可以用一個(gè)int代替,此時(shí),int會(huì)轉(zhuǎn)換為一個(gè)A類型臨時(shí)變量

如對(duì)a1變量的賦值操作:

A a1;   //聲明a1,a1被默認(rèn)初始化
a1 = 2; //2轉(zhuǎn)換為A類型的臨時(shí)變量,對(duì)a1進(jìn)行賦值操作

對(duì)于隱式類型轉(zhuǎn)換,需要注意兩點(diǎn):

隱式類型轉(zhuǎn)換只允許一步轉(zhuǎn)換

class B{
public:
    string B_s;
    B() = default;
    B(string s) : B_s(s){};
};
int main(){
    B b1,b2;
    //錯(cuò)誤:char*->string->B,進(jìn)行了兩步轉(zhuǎn)換
    b1 = "hello"; 
    b2 = string("hello");
    return 0;
}

接受隱式類型轉(zhuǎn)換得到的對(duì)象的函數(shù),參數(shù)傳遞方式必須是const引用傳遞

因?yàn)閏++中,一般不修改臨時(shí)對(duì)象,所以臨時(shí)對(duì)象只能傳遞給const引用。

分析a1

A a1:

a1進(jìn)行默認(rèn)初始化,調(diào)用默認(rèn)構(gòu)造函數(shù)A()

a1 = 2

  • 字面量2隱式轉(zhuǎn)換為A類型的臨時(shí)對(duì)象
  • 該臨時(shí)對(duì)象通過拷貝運(yùn)算符operator=拷貝給a1
  • 因?yàn)槭桥R時(shí)對(duì)象,所以operator=必須接受const引用,否則造成編譯錯(cuò)誤

分析a2

A a2 = 2

  • 字面量2隱式轉(zhuǎn)換為A類型的臨時(shí)對(duì)象
  • 用臨時(shí)對(duì)象來拷貝初始化a2,調(diào)用拷貝構(gòu)造函數(shù)A(const A&),相當(dāng)于A a2(A(2))
  • 因?yàn)槭桥R時(shí)對(duì)象,所以拷貝構(gòu)造函數(shù)A(const A&)必須接受const引用,否則造成編譯錯(cuò)誤

特別注意

編譯器會(huì)將A a2(A(2))優(yōu)化為A a2(2)

所以程序輸出“A(int i)”,而不是“A(const A&)”

但是底層仍然調(diào)用了A(const A&),所以如果把A(const A&)改為A(A&),會(huì)造成編譯錯(cuò)誤 error: cannot bind non-const lvalue reference of type 'A&' to an rvalue of type 'A'

這提示我們,在編寫c++程序時(shí),如果不改變對(duì)象的值,那么習(xí)慣性地采用const引用會(huì)避免許多難解的編譯錯(cuò)誤

分析a3

用a1直接初始化a3,調(diào)用A(const A&)

到此這篇關(guān)于c++隱式類型轉(zhuǎn)換存在的陷阱的文章就介紹到這了,更多相關(guān)c++隱式類型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解析結(jié)構(gòu)體的定義及使用詳解

    解析結(jié)構(gòu)體的定義及使用詳解

    本篇文章是對(duì)結(jié)構(gòu)體的定義以及使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ opencv ffmpeg圖片序列化實(shí)現(xiàn)代碼解析

    C++ opencv ffmpeg圖片序列化實(shí)現(xiàn)代碼解析

    這篇文章主要介紹了C++ opencv ffmpeg圖片序列化實(shí)現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • C語言小程序 計(jì)算第二天日期示例代碼

    C語言小程序 計(jì)算第二天日期示例代碼

    輸入一個(gè)日期,判斷下一個(gè)日期是哪一天,如果日期輸入錯(cuò)誤,則調(diào)用Linux下的cal命令顯示輸入的月份
    2013-07-07
  • VisualStudio2022打包項(xiàng)目文件為.exe安裝包

    VisualStudio2022打包項(xiàng)目文件為.exe安裝包

    本文主要介紹了VisualStudio2022打包項(xiàng)目文件為.exe安裝包,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C++實(shí)現(xiàn)教務(wù)管理系統(tǒng)

    C++實(shí)現(xiàn)教務(wù)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)教務(wù)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 基于C語言實(shí)現(xiàn)圖書管理信息系統(tǒng)設(shè)計(jì)

    基于C語言實(shí)現(xiàn)圖書管理信息系統(tǒng)設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)圖書管理信息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Ubuntu系統(tǒng)下如何在VScode配置OpenCV(C++)環(huán)境(.json文件)

    Ubuntu系統(tǒng)下如何在VScode配置OpenCV(C++)環(huán)境(.json文件)

    這篇文章主要介紹了如何在VSCode中配置和運(yùn)行C++程序,包括創(chuàng)建test.cpp文件、配置launch.json、tasks.json和c_cpp_properties.json文件,以及重啟VSCode以解決可能的報(bào)錯(cuò)問題,需要的朋友可以參考下
    2025-02-02
  • C++實(shí)現(xiàn)簡(jiǎn)單遺傳算法

    C++實(shí)現(xiàn)簡(jiǎn)單遺傳算法

    這篇文章主要介紹了C++實(shí)現(xiàn)簡(jiǎn)單遺傳算法,以實(shí)例形式較為詳細(xì)的分析了遺傳算法的C++實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • Visual Studio Code配置C/C++開發(fā)環(huán)境的教程圖解

    Visual Studio Code配置C/C++開發(fā)環(huán)境的教程圖解

    這篇文章主要介紹了Visual Studio Code配置C/C++開發(fā)環(huán)境的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • C++實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)

    C++實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論

类乌齐县| 札达县| 新乐市| 潢川县| 敦煌市| 盈江县| 兴城市| 临猗县| 深泽县| 右玉县| 北安市| 西乌珠穆沁旗| 阜阳市| 普兰店市| 华安县| 闽侯县| 北宁市| 彭州市| 三门峡市| 宁海县| 五寨县| 台江县| 凤台县| 中卫市| 绥棱县| 什邡市| 同江市| 福泉市| 衡阳市| 木兰县| 盐源县| 宁武县| 禹城市| 定结县| 龙岩市| 越西县| 河间市| 伊川县| 周至县| 贡嘎县| 镇宁|