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進行賦值操作對于隱式類型轉換,需要注意兩點:
因為c++中,一般不修改臨時對象,所以臨時對象只能傳遞給const引用。
3|0分析a1
A a1:
a1進行默認初始化,調用默認構造函數A()
a1 = 2
4|0分析a2
A a2 = 2
特別注意
編譯器會將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++隐式类型转换存在的陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS开发--TextField
- 下一篇: C++ 高级篇(三)—— 出错处理