轉換操作符

2021-05-24 23:52:20 字數 1682 閱讀 3169

有兩種轉換,我一向比較陌生,用得少嘛!並且都是編譯器自動轉換。

第一種:內建資料型別(大多數)到類的轉換。最經典的是c型別字串到string類物件的轉換。如:

fun(string str);

fun("wangyi");//

編譯器呼叫了string(char*),自動轉換。

如果希望編譯器不自動呼叫具有此引數的建構函式,在建構函式前加上explicit。

第二種:類到內建資料型別或者其他類的轉換。

也是編譯器自動呼叫。如:

class smallint

operator int() const //

從smallint轉換成

int.

private:

std::size_t val;

}轉換函式需要注意:

1)無返回型別,但必須顯示返回乙個指定型別的值。

2)必須是成員函式,形參表為空。

3)通常定義為const。

編譯器在哪些地方會自動呼叫轉換函式呢?如下:

smallint si;

double d;

si+d;//si->int->double

if(si);//si->int->bool

coutint calc(int);

calc(si);//si->int

int i=static_cast(si)//

顯示轉換中也要呼叫。

注意:只能應用乙個類型別轉換。即編譯器不會連續呼叫類的轉換函式。如:類integral實現了轉換成smanllint的轉換函式。

intgral ival;

ival+3;//error.

不能ival->smallint->int

以上兩種轉換,就會出現很多二義性,都和過載函式有關:

1)由轉換轉換函式過載引起的

class smallint

;fun(long double);

smallint si;

fun(si);//error

。呼叫哪乙個轉換函式呢?是si->int->long double還是si->double->long double?

2)由建構函式過載引起的二義性

class smallint

;smallint si;

fun(smallint);

long double ld;

fun(ld);//error

。是呼叫哪個建構函式呢?是ld->int ->smallint還是

ld->double->smallint?

3)相互提供隱式轉換的類引起的二義性

class smallint

;integral

;fun(smallint);

intetal ival;

fun(ival);//error.

是呼叫smllint(intetal)還是

4)轉換函式,建構函式,和操作符引起的二義性

class smallint

;smllint s1,s2;

smallint s3=s1+s2;//operator+

int i=s1+10;//s1->int,

內建的operator+;10->smallint,友元operator+;

**:

操作符 字串操作符 和 型別轉換操作符

一 字串操作符 對於 的使用,當所有值都是數字的時候,執行計算處理 當有乙個是字元型別的時候,就將數字轉換為string字串進行拼接處理。二 型別轉換操作符 public class text 結果 int above 0.7 0 math.round above 0.7 1 int below 0...

強制型別轉換操作符

操作符 中文名稱 含義 dynamic cast 動態型別轉換符 支援多型而存在,主要用於類之間的轉換 static cast 靜態型別轉換符 僅僅完成編譯時期的轉換檢查 reinterpret cast 再解釋型別轉換符 完成不同型別指標之間的相互轉換 const cast 常型別轉換符 用來修改...

過載操作符與轉換

過載操作符函式 保留字operator後接需要定義的操作符號,有返回型別和形參表 不能過載的操作符有 不能通過連線其他合法符號來建立任何新的操作符 過載操作符必須具有乙個類型別運算元,以為如果只有內建型別物件的話,會重新定義原來的操作符 操作符的優先順序和結合性是固定的 不再具備短路求值特性 當運算...