網(wǎng)站首頁 編程語言 正文
什么是隱式轉(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í)編譯器究竟干了那些事:
#includeusing namespace std; class A{ public: int x; A() {cout<<"A()"<
運(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&)
原文鏈接:https://www.cnblogs.com/timothy020/p/15948051.html
相關(guān)推薦
- 2022-10-11 詳解pandas?df.iloc[]的典型用法_python
- 2022-07-03 C#并行編程之PLINQ(并行LINQ)_C#教程
- 2022-06-29 python人工智能tensorflow函數(shù)tf.get_variable使用方法_python
- 2022-12-29 Python?Setuptools的?setup.py實(shí)例詳解_python
- 2022-03-16 Linux系統(tǒng)中日志詳細(xì)介紹_Linux
- 2022-03-30 Flutter有狀態(tài)組件使用詳解_Android
- 2022-06-13 Docker鏡像的commit操作示例及作用_docker
- 2022-06-23 C#中的小數(shù)和百分?jǐn)?shù)計(jì)算與byte數(shù)組操作_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支