c++隱式類型轉(zhuǎn)換存在的問題解析
什么是隱式轉(zhuǎn)換:
c++中的基本類型并非完全對立,部分類型之間是可以進行隱式轉(zhuǎn)換的,所謂隱式轉(zhuǎn)換,是指不需要用戶干預,編譯器私下進行的類型轉(zhuǎn)換行為,很多時候用戶都不知道具體進行了哪些轉(zhuǎn)換
為什么要進行隱式轉(zhuǎn)換:
隱式轉(zhuǎn)換可以讓程序員在兩個不同類型的數(shù)據(jù)直接進行操作,而不用自行轉(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
目標代碼
旨在弄懂下面的代碼,明確變量a1,a2,a3在創(chuàng)建時編譯器究竟干了那些事:
#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;
}運行結(jié)果:

構(gòu)造函數(shù)定義的隱式類型轉(zhuǎn)換
任何只接受一個參數(shù)的構(gòu)造函數(shù),都隱式地定義了由該參數(shù)向該類型的隱式類型轉(zhuǎn)換
如A(int i)定義了一個由int向A的隱式類型轉(zhuǎn)換
所以,在任何使用A對象的地方,可以用一個int代替,此時,int會轉(zhuǎn)換為一個A類型臨時變量
如對a1變量的賦值操作:
A a1; //聲明a1,a1被默認初始化 a1 = 2; //2轉(zhuǎn)換為A類型的臨時變量,對a1進行賦值操作
對于隱式類型轉(zhuǎn)換,需要注意兩點:
隱式類型轉(zhuǎn)換只允許一步轉(zhuǎn)換
class B{
public:
string B_s;
B() = default;
B(string s) : B_s(s){};
};
int main(){
B b1,b2;
//錯誤:char*->string->B,進行了兩步轉(zhuǎn)換
b1 = "hello";
b2 = string("hello");
return 0;
}接受隱式類型轉(zhuǎn)換得到的對象的函數(shù),參數(shù)傳遞方式必須是const引用傳遞
因為c++中,一般不修改臨時對象,所以臨時對象只能傳遞給const引用。
分析a1
A a1:
a1進行默認初始化,調(diào)用默認構(gòu)造函數(shù)A()
a1 = 2
- 字面量2隱式轉(zhuǎn)換為A類型的臨時對象
- 該臨時對象通過拷貝運算符
operator=拷貝給a1 - 因為是臨時對象,所以
operator=必須接受const引用,否則造成編譯錯誤
分析a2
A a2 = 2
- 字面量2隱式轉(zhuǎn)換為A類型的臨時對象
- 用臨時對象來拷貝初始化a2,調(diào)用拷貝構(gòu)造函數(shù)
A(const A&),相當于A a2(A(2)) - 因為是臨時對象,所以拷貝構(gòu)造函數(shù)
A(const A&)必須接受const引用,否則造成編譯錯誤
特別注意
編譯器會將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&),會造成編譯錯誤 error: cannot bind non-const lvalue reference of type 'A&' to an rvalue of type 'A'
這提示我們,在編寫c++程序時,如果不改變對象的值,那么習慣性地采用const引用會避免許多難解的編譯錯誤
分析a3
用a1直接初始化a3,調(diào)用A(const A&)
到此這篇關(guān)于c++隱式類型轉(zhuǎn)換存在的陷阱的文章就介紹到這了,更多相關(guān)c++隱式類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ opencv ffmpeg圖片序列化實現(xiàn)代碼解析
這篇文章主要介紹了C++ opencv ffmpeg圖片序列化實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08
VisualStudio2022打包項目文件為.exe安裝包
本文主要介紹了VisualStudio2022打包項目文件為.exe安裝包,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
基于C語言實現(xiàn)圖書管理信息系統(tǒng)設(shè)計
這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)圖書管理信息系統(tǒng)設(shè)計與實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
Ubuntu系統(tǒng)下如何在VScode配置OpenCV(C++)環(huán)境(.json文件)
這篇文章主要介紹了如何在VSCode中配置和運行C++程序,包括創(chuàng)建test.cpp文件、配置launch.json、tasks.json和c_cpp_properties.json文件,以及重啟VSCode以解決可能的報錯問題,需要的朋友可以參考下2025-02-02
Visual Studio Code配置C/C++開發(fā)環(huán)境的教程圖解
這篇文章主要介紹了Visual Studio Code配置C/C++開發(fā)環(huán)境的教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06

