C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换
生活随笔
收集整理的這篇文章主要介紹了
C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 在兩種情況下會產(chǎn)生二義性轉(zhuǎn)換歧義:
1.1 A類定義了一個接受B類對象的轉(zhuǎn)換構(gòu)造函數(shù),同時B類定義了一個轉(zhuǎn)換目標是A類的類型轉(zhuǎn)換運算符。
struct B; struct A {A() = default;A(const B&); //把一個B轉(zhuǎn)換為A };struct B{ operator A() const; //也是把B轉(zhuǎn)換為A }A f(const A& a) {return a;}B b; A a = f(b); //二義性錯誤,含義是 f(B::operator A()) 還是f(A::A(const B&)) ???如果確實要執(zhí)行上面的調(diào)用需要顯示的調(diào)用:
A a1 = f(b.operator A()); A a2 = f(A(b));1.2 類定義了多個類型轉(zhuǎn)換規(guī)則,而這些轉(zhuǎn)換涉及的類型本身可以通過其他類型轉(zhuǎn)換聯(lián)系在一起。
標為內(nèi)置類型的多重類型轉(zhuǎn)換
struct A{//最好不要創(chuàng)建兩個轉(zhuǎn)換源都是算術(shù)類型的類型轉(zhuǎn)換A(int = 0);A(double);//最好不要創(chuàng)建兩個轉(zhuǎn)換對象都是算術(shù)類型的類型轉(zhuǎn)換operator int() const;operator double() const; };void f2(long double); A a; f2(a); //二義性錯誤,含義是 f(A::operator int()),還是f(A::operator double())long lg; A a2(lg); //二義性錯誤,含義是A::A(int) 還是 A::A(double)上面的轉(zhuǎn)換因為不存在最佳匹配,所以會造成二義性。
short s = 42; A a3(s); //使用 A::A(int),因為short轉(zhuǎn)換成int由于short轉(zhuǎn)換成double2. 設(shè)計原則
- 不要為兩個類定義相同的類型轉(zhuǎn)換,也不要在類中定義兩個及兩個以上轉(zhuǎn)換源或者轉(zhuǎn)換目標是算術(shù)類型的轉(zhuǎn)換。
- 如果類中包含一個或多個類型轉(zhuǎn)換,則必須保證在類類型和目標類型之間只存在唯一的一種轉(zhuǎn)換方式,否則的話,有可能出現(xiàn)二義性。eg. 最典型的例子就是算術(shù)運算符。
- 當我們使用兩個用戶定義的類型轉(zhuǎn)換時,如果轉(zhuǎn)換函數(shù)之前或者之后存在標準類型轉(zhuǎn)換,則標準類型轉(zhuǎn)換將決定最佳匹配到底是哪個
- 除了顯式向bool類型的轉(zhuǎn)換為,應(yīng)該盡量避免定義類型轉(zhuǎn)換函數(shù)并盡可能地限制“顯然正確”的非顯式構(gòu)造函數(shù)。
3. 重載函數(shù)與轉(zhuǎn)換構(gòu)造函數(shù)
struct C {C(int); }; struct D {D(int); };void manip(const C&); void manip(const D&); manip(10); //二義性錯誤,含義是manip(C(10))還是manip(D(10))manip(C(10)); //正確,顯示的指明調(diào)用- 如果在調(diào)用重載函數(shù)時,需要構(gòu)造函數(shù)或者強制類型轉(zhuǎn)換來改變實參類型,則這通常意味著程序設(shè)計存在不足。
4. 重載函數(shù)與用戶定義的類型轉(zhuǎn)換
在調(diào)用重載函數(shù)時,如果類型轉(zhuǎn)換不止一個且彼此不同,則該調(diào)用具有二義性,即使其中一個調(diào)用需要額外的標準類型轉(zhuǎn)換而另一個調(diào)用能精確匹配,編譯器也會提示錯誤。
struct E {E(double){} }; manip(10); //二義性錯誤,含義是manip(C(10))還是manip(E(10))【引用】
[1] 代碼classTypeExchange.h
總結(jié)
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha