過載型別轉換操作符 遇到的問題

2021-06-20 12:44:51 字數 3156 閱讀 7204

今天我對這段**產生了質疑:

operator double ()

我感覺應該是這樣:

double operator double ()

於是我就在csdn上發了乙個貼問了問,經過zhangweiit,mstlq,djjlove_2008,taodm(非常感謝他們)的指點後明白了這是c++的語法規則,我居然不知道。於是我翻開了久違了的《c++ primer》第四版p454,進行了整理(摘抄),希望掌握這個知識點,也希望看到這篇文章的人也掌握這個知識點。

轉換操作符

轉換操作符(conversion operator)是一種特殊的類成員函式。它定義將類型別值轉變為其他型別值的轉換。轉換操作符在類定義體內宣告,在保留字operator之後跟著轉換的目標型別:

class smallint

}operator int() const

private: 

std::size_t val;

};轉換函式採用如下通用形式:

operator type();

這裡,type表示內建型別名、類型別名或有型別別名所定義的名字。對任何可作為函式的返回型別(除了void之外)。一般而言,不允許轉換為陣列或函式型別,轉換為指標型別(資料和函式指標)以及引用型別是可以的。

註解: 轉換函式必須是成員函式,不能指定返回型別,並且形參表必須為空。

下述所有的宣告都是錯誤的:

operator int(small int& ); // error:nonmember

class smallint

;雖然轉換函式不能指定返回型別,但是每個轉換函式必須顯示返回乙個指定的值。例如,operator int返回乙個int值;如果定義operator sales_item,它將返回乙個sales_item物件,諸如此類。

最佳實踐: 轉換函式一般不應該改變被轉換的物件。因此,轉換操作符通常應定義為const成員。

1、使用類型別轉換

只要存在轉換,編譯器將在可以使用內建轉換的地方自動呼叫它

在表示式中:

smallint si;

double dval;

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

在條件中:

if(si) // si convert to int and then convert to bool

將實參傳給函式或 從函式返回值:

int calc(int);

smallint si;

int i = calc(si); // convert si to int and call calc

作為過載操作符的運算元:

// convert si to int then call << on the int value

cout << si << endl;

在顯示型別轉換中:

int ival;

smallint si = 3.54;

// instruct compiler to cast si to int

ival = static_cast(si) + 3;

2、類型別轉換和標準轉換

使用轉換函式時,被轉換的型別不必與所在需要的型別完全匹配。必要時可在類型別轉換之後跟上標準轉換以獲得想要的型別。例如,在乙個smallint物件與乙個double值的比較中:

smallint si;

double dval;

si >= dval // si converted to int and then convert to double.

首先將si從smallint物件轉換為int值,然後將該int值轉換為double值。

3、只能應用乙個類型別轉換

註解:類型別轉換之後再跟另乙個類型別轉換。如果需要多個類型別轉換,則**將出錯。

例如,假定有乙個類integral,它可以轉換為smallint但不能轉換為int:

// class to hold unsigned integral values

class integral

operator smallint()const

private:

std::size_t val;

};可以在需要smallint的地方使用integral,但不能再需要int的地方使用integral:

int calc(int);

integral intval;

smallint si(intval); // ok:convert intval to small int and copy to si

int i = calc(si);  // ok:convert si to int and call calc

int j = calc(intval);// error:on convertion to int from integral

建立si時使用smallint複製建構函式。首先呼叫integral轉換操作符產生乙個smallint型別的臨時值,將int_val物件轉換為smallint物件。然後(合成的)複製建構函式使用該物件值初始化si。

第乙個calc呼叫也是正確的:將實參si自動轉換為int,然後將int值傳給函式。

第二個calc呼叫時錯誤的:沒有從integral到int的直接轉換。從intergral獲得int需要兩次類型別轉換:首先從intergral到smallint,然後從smallint到int。但是,語言只是允許乙個類型別轉換,所以該呼叫出錯。

4.標準轉換可放在類型別轉換之前

使用建構函式執行隱式轉換的時候,建構函式的形參型別不必與所提供的型別完全匹配。例如,下面的**呼叫smallint類中定義的建構函式smallint(int)將sobj轉換為smallint型別:

void calc(smallint);

short sobj;

// sobj prometed from short to int 

// that int converted to smallint through the smallint(int) constructor

calc(sobj);

如果需要,在呼叫建構函式執行類型別轉換之前,可將乙個標準轉換序列應用於實參。為了呼叫函式calc(),應用標準轉換將dobj從double型別轉換為int型別,然後呼叫建構函式smallint(int)將轉換結果轉換為smallint型別。

C 過載型別轉換操作符

在需要做資料型別轉換時,一般顯式的寫法是 cpp view plain copy font size 18px type1 i type2 d i type1 d 顯式的寫型別轉,把d從type2型別轉為type1型別 這種寫法不能做到無縫轉換,也就是直接寫 i d,而不需要顯式的寫 type1 來...

怎樣過載強制型別轉換操作符

private double m data 這是乙個非常簡單的例子,不過它已經足以描述我要說明的問題。假如,我們有如下的乙個函式 print int n 當我們如下來使用mydouble的時候 mydouble dbl 234.33 print dbl 注意此處正隱式呼叫了operator int ...

型別轉換和操作符過載 c

也許你從來沒有考慮過型別轉換和操作符過載的問題,畢竟在很多時候,我們都是系統標準型別,使用內建的一些轉換函式和操作符。但是假設你經常性地需要建立自定義型別 或者結構體 同時你想為它們都實現更加豐富的效果,那麼了解.net所支援的型別轉換和操作符過載就顯得有些必要了 下面看看乙個結構體的定義 publ...