91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中類類型轉換操作符的示例分析

發布時間:2021-08-25 14:54:54 來源:億速云 閱讀:160 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“C++中類類型轉換操作符的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C++中類類型轉換操作符的示例分析”這篇文章吧。

實例如下:

class SmallInt {
public:
  SmallInt(int i = 0): val(i)
  { 
   if (i < 0 || i > 255)
    throw std::out_of_range("Bad SmallInt initializer");
  }
  operator int() const { return val; }
private:
  std::size_t val;
};

轉換函數采用如下通用形式:

operator type();

type表示內置類型名、類類型名或由類型別名定義的名字。對任何可作為函數返回類型的類型(除了 void 之外)都可以定義轉換函數。一般而言,不允許轉換為數組或函數類型,轉換為指針類型(數據和函數指針)以及引用類型是可以的。轉換函數必須是成員函數,不能指定返回類型,并且形參表必須為空。operator int 返回一個 int 值;如果定義 operator Sales_item,它將返回一個 Sales_item 對象,諸如此類。轉換函數一般不應該改變被轉換的對象。因此,轉換操作符通常應定義為 const 成員。

SmallInt si;

double dval;

si >= dval // si converted to int and then convert todouble

優點:類類型轉換可能是實現和使用類的一個好處。通過為 SmallInt 定義到int 的轉換,能夠更容易實現和使用 SmallInt 類。int 轉換使 SmallInt 的用戶能夠對 SmallInt 對象使用所有算術和關系操作符,而且,用戶可以安全編寫將 SmallInt 和其他算術類型混合使用的表達式。定義一個轉換操作符就能代替定義 48個(或更多)重載操作符,類實現者的工作就簡單多了。

缺點:二義性

class SmallInt {

public:

     SmallInt(int= 0);

    SmallInt(double);

//Usually it is unwise to define conversions to multiple arithmetic types

    operatorint() const { return val; }

    operatordouble() const { return val; }

private:

   std::size_tval;

};

 

void compute(int);

void fp_compute(double);

void extended_compute(long double);

SmallInt si;

compute(si); // SmallInt::operator int() const

fp_compute(si); // SmallInt::operator double() const

extended_compute(si); // error: ambiguous

對 extended_compute 的調用有二義性。可以使用任一轉換函數,但每個都必須跟上一個標準轉換來獲得 long double,因此,沒有一個轉換比其他的更好,調用具有二義性。

如果兩個轉換操作符都可用在一個調用中,而且在轉換函數之后存在標準轉換,則根據該標準轉換的類別選擇最佳匹配。若無最佳匹配,就會出現二義性。

再比如:

可能存在兩個轉換操作符,也可能存在兩個構造函數可以用來將一個值轉換為目標類型。

考慮 manip 函數,它接受一個 SmallInt 類型的實參:

void manip(const SmallInt &);

double d; int i; long l;

manip(d); // ok: use SmallInt(double) to convert theargument

manip(i); // ok: use SmallInt(int) to convert theargument

manip(l); // error: ambiguous

第三個調用具有二義性。沒有構造函數完全匹配于 long。使用每一個構造函

數之前都需要對實參進行轉換:

1. 標準轉換(從 long 到double)后跟 SmallInt(double)。

2. 標準轉換(從 long 到int)后跟 SmallInt(int)。

這些轉換序列是不能區別的,所以該調用具有二義性。

當兩個類定義了相互轉換時,很可能存在二義性:

class Integral;

class SmallInt {

public:

SmallInt(Integral);// convert from Integral to SmallInt

};

class Integral {

public:

operatorSmallInt() const; // convert from Integral to SmallInt 

};

 

void compute(SmallInt);

Integral int_val;

compute(int_val); // error: ambiguous

實參 int_val 可以用兩種不同方式轉換為 SmallInt 對象,編譯器可以使

用接受 Integral 對象的構造函數,也可以使用將 Integral 對象轉換為

SmallInt 對象的 Integral 轉換操作。因為這兩個函數沒有高下之分,所以這

個調用會出錯。

在這種情況下,不能用顯式類型轉換來解決二義性——顯式類型轉換本身既可以使用轉換操作又可以使用構造函數,相反,需要顯式調用轉換操作符或構造函數:

compute(int_val.operator SmallInt()); // ok: useconversion operator

compute(SmallInt(int_val)); // ok: use SmallInt constructor

改變構造函數以接受 const Integral 引用:

class SmallInt {

public:

SmallInt(constIntegral&);

};

則對compute(int_val) 的調用不再有二義性!原因在于使用 SmallInt構造函數需要將一個引用綁定到 int_val,而使用 Integral 類的轉換操作符可以避免這個額外的步驟。這一小小區別足以使我們傾向于使用轉換操作符。

顯式強制轉換消除二義性

class SmallInt {

public:

// Usually it is unwise to define conversions tomultiple

arithmetic types

operatorint() const { return val; }

operatordouble() const { return val; }

// ...

private:

std::size_tval;

};

void compute(int);

void compute(double);

void compute(long double);

SmallInt si;

compute(si); // error: ambiguous


可以利用顯式強制轉換來消除二義性:

compute(static_cast<int>(si)); // ok: convertand call compute(int)


顯式構造函數調用消除二義性

class SmallInt {

public:

SmallInt(int= 0);

};

class Integral {

public:

Integral(int= 0);

};

void manip(const Integral&);

void manip(const SmallInt&);

manip(10); // error: ambiguous

可以用顯示構造函數消除二義性:

manip(SmallInt(10)); // ok: call manip(SmallInt)

manip(Integral(10)); // ok: call manip(Integral)

標準轉換優于類類型轉換

class LongDouble

{

public:

     LongDouble(double );

     //…

};

void calc( int );

void calc( LongDouble );

double dval;

calc( dval ); // which function

最佳可行函數是voidcalc(int), 調用此函數的轉換為:將實參double類型轉換為int類型的,為標準轉換;調用voidcalc( LongDouble)函數時,將實參從double轉換為LongDouble類型,為類類型轉換,因為標準轉換優于類類型轉換,所以第一個函數為最佳可行函數。

以上是“C++中類類型轉換操作符的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

凤台县| 西乌珠穆沁旗| 大方县| 平湖市| 清涧县| 大连市| 勃利县| 凌海市| 本溪市| 平塘县| 中宁县| 自贡市| 安康市| 宁波市| 黄陵县| 丰都县| 建阳市| 武宁县| 扶绥县| 六枝特区| 潢川县| 沂源县| 广元市| 潼南县| 宁南县| 宜宾县| 永州市| 麻栗坡县| 呈贡县| 江川县| 德惠市| 耿马| 全州县| 鲜城| 大化| 苍梧县| 银川市| 大兴区| 修水县| 靖江市| 连州市|