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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++隐式类型转换存在的陷阱

發布時間:2023/12/9 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++隐式类型转换存在的陷阱 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python微信訂餐小程序課程視頻

https://edu.csdn.net/course/detail/36074

Python實戰量化交易理財系統

https://edu.csdn.net/course/detail/35475
目錄* 目標代碼

  • 構造函數定義的隱式類型轉換
  • 分析a1
  • 分析a2
  • 分析a3

1|0目標代碼

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

#include 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; }

運行結果:

2|0構造函數定義的隱式類型轉換

任何只接受一個參數的構造函數,都隱式地定義了由該參數向該類型的隱式類型轉換

如A(int i)定義了一個由int向A的隱式類型轉換

所以,在任何使用A對象的地方,可以用一個int代替,此時,int會轉換為一個A類型臨時變量

如對a1變量的賦值操作:

A a1; //聲明a1,a1被默認初始化 a1 = 2; //2轉換為A類型的臨時變量,對a1進行賦值操作

對于隱式類型轉換,需要注意兩點:

  • 隱式類型轉換只允許一步轉換
  • class B{ public:string B\_s;B() = default;B(string s) : B\_s(s){}; }; int main(){B b1,b2;//錯誤:char*->string->B,進行了兩步轉換b1 = "hello"; b2 = string("hello");return 0; }
  • 接受隱式類型轉換得到的對象的函數,參數傳遞方式必須是const引用傳遞
  • 因為c++中,一般不修改臨時對象,所以臨時對象只能傳遞給const引用

    3|0分析a1

    A a1:

    a1進行默認初始化,調用默認構造函數A()

    a1 = 2

  • 字面量2隱式轉換為A類型的臨時對象
  • 該臨時對象通過拷貝運算符operator=拷貝給a1
  • 因為是臨時對象,所以operator=必須接受const引用,否則造成編譯錯誤
  • 4|0分析a2

    A a2 = 2

  • 字面量2隱式轉換為A類型的臨時對象
  • 用臨時對象來拷貝初始化a2,調用拷貝構造函數A(const A&),相當于A a2(A(2))
  • 因為是臨時對象,所以拷貝構造函數A(const A&)必須接受const引用,否則造成編譯錯誤
  • 特別注意

    編譯器會將A a2(A(2))優化為A a2(2)

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

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

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

    5|0分析a3

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

    __EOF__

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vTFH6q7S-1646068357283)(https://blog.csdn.net/timothy020/p/15948051.html)]萌之上 本文鏈接:https://blog.csdn.net/timothy020/p/15948051.html關于博主:評論和私信會在第一時間回復。或者直接私信我。版權聲明:本博客所有文章除特別聲明外,均采用 BY-NC-SA 許可協議。轉載請注明出處!聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角**【[推薦](javascript:void(0)😉】**一下。您的鼓勵是博主的最大動力!

    總結

    以上是生活随笔為你收集整理的c++隐式类型转换存在的陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。

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