GeekBand c++學習筆記之四(conversion fuction vs non-explicit-one-arguement ctor)
大家好,因為這一周所講述的課程點比較分散,所以我就記錄與分享一下我比較深刻與個人覺得比較有趣的部份,這個部分就conversion fuction和non-explicit-one-arguement ctor,為甚麼我覺得這兩個特別有意思,因為我覺得可以看見不同的類型變數依自己設計的函數變換類型,再做兩者的運算特別有意思,而non-explicit-one-arguement ctor也是如此,兩者相當相似,但也不同,會使人混亂,但也很有趣,所以向大家介紹
conversion fuction:
<span style="font-size:18px;"><span style="font-size:18px;">class Franction { public: Franction(int num,int den=1):m_numerator(num),m_denominator(den){} operator double()const{ return (double)(m_numerator/m_denominator); } private: int m_numerator; int m_denominator; }; int main() { Franction f(3,5); double d=4+f; return 0; }</span></span>
這是個轉換函數,他是如何運作的呢!我們從測試端看,double d=4+f,我們先看d被定為double類型,但是4是int型,而f是Franction型,所以三者都是不同的,但是run時,卻已經把他們的類型都轉了,因為在創建d的時候,operator () const函數作用了,而他的轉換類型也由我們設計好的傳換到double型,4也同時被轉換為double,所以double d才沒有錯誤的創建
non-explicit-one-arguement ctor:
<span style="font-size:18px;"><span style="font-size:18px;">class Franction { public: Franction(int num,int den=1) :m_numerator(num),m_denominator(den){} Franction operator +(const Franction&f) { return Franction(...); } private: int m_numerator; int m_denominator; }; int main() { Franction f(3,1); Franction d=f+4; return 0; }</span></span>
可以看到其實跟conversion fuction是有類似的地方,先來解釋他的ctor為何為non-explicit-one-arguement,因為在他的函數前沒有加上explicit,而one-arguement是因為他已經有一個餐是以經是有默認值了,但是你可以說跟前者的ctor相同,但是他們的轉換方式不同,以至於他們的函數表現也不同,先看non-explicit-one-arguement ctor的設計端,在Franction d=f+4,d是Franction型,4是int型,f是Franction型,他在run時是這樣做的,先調用non-explicit-one-arguement ctor把4轉為Franction型就是Franction(4,1),這樣就不會出錯
這樣看起來,似乎兩者都是轉換函數,但是兩者也是相當的矛盾的,如下
conversion fuction vs non-explicit-one-arguement ctor
<span style="font-size:18px;">class Franction { public: Franction(int num,int den=1) :m_numerator(num),m_denominator(den){} operator double()const{ return (double)(m_numerator/denominator); } Franction operator +(const Franction) { return Franction(...); } private: int m_numerator; int m_denominator; }; Franction f(3,5); Franction d2=f+4;//[error]ambiguous </span>
這裡編譯氣就會發生錯誤,其會顯示[error]ambiguous,這是什麼意思呢!是引起歧意的意思,引起歧意,因為compiler做不出抉擇,因為有兩個方式run
1.Franction d2=f+4;會將4轉為double,operator (double)作用
2.Franction d2=f+4;會將4轉為Franction,Franction operator作用
所以在轉換上要選擇好用哪種方法,不然會錯誤
- C++中的转换函数、explicit关键字与non-explicit-one-argument构造函数
- One hundred things
- Ch3-4: solve Hanoi in C++ with recursion, and with stack explicitly
- android_java.lang.Throwable: Explicit termination method 'end' not called
- Mobility Model and Routing Model about the ONE
- 从spring jpa getone 说到 Hibernate中的动态代理Javassist
- 错误:One or more post-processing actions failed. Consult the OPP service log for details
- leetcode 485. Max Consecutive Ones
- 导入项目一直显示Select at least one project
- 转-Cannot refer to an instance field arg while explicitly invoking a constructor
- Step one : 熟悉Unix/Linux Shell 常见命令行 (三)
- Codeforces Round #374 (Div. 2) A. One-dimensional Japanese Crossword —— 基础题
- close() was never explicitly called on database 和 database is locked 错误原因
- @OneToMany单向一对多
- AddType requires at least two arguments, a mime type followed by one or more file extensions
- java web week_one
- One Day One Step之图论(1)
- 《Ray Tracing in One Weekend》——Chapter 10: Positionable camera
- One Day One Step 之Greedy Gift Givers
- 'UIAlertController can only have one action with a style of UIAlertActionStyleCancel'