C 運算子過載補充之不同資料間的型別轉換

2021-06-27 08:50:43 字數 2934 閱讀 5398

我們在使用過載的運算子時,往往需要在自定義資料型別和系統預定義的資料型別之間進行轉換,或者需要在不同的自定義資料型別之間進行轉換。今天就來講講c++中資料型別的轉換。

1.對於系統的預定義基本型別資料,c++提供了兩種型別轉換方式:隱式型別轉換和顯式型別轉換。

inta=

5,sum;

doubleb=

5.55

;sum=a

+b;//-------(1)

std::cout

<<

"隱式轉換:a+b=

"<<

sum<<

std::endl;

sum=

(int

)(a+

b);//

-------(2)

sum=

int(a

+b);

//-------(3)

std::cout

<<

"顯式轉換:a+b=

"<<

sum<<

std::endl;

上述**中的(1)就是含有隱式型別轉換的表示式,在進行"a+b"時,編譯系統先將a的值5轉換為雙精度double,然後和b相加得到10.55,在向整形變數sum賦值時,將10.55轉換為整形數10,賦值為變數sum。這種轉換是c++編譯系統自動完成,不需要使用者去干預。而上例中的(2)和(3)中則涉及到了顯式型別轉換,它們都是把a+b所得結果的值,強制轉化為整形數。只是(2)式是c語言中用到的形式:(型別名)表示式,而(3)式是c++中的採用的形式:型別名(表示式);

2.那麼對於使用者自定義的類型別而言,有該如何去實現它們和其他資料型別之間的轉換呢,c++中提供了來那個中方法:(1)通過轉換建構函式進行型別轉換;(2)通過型別轉換函式進行型別轉換;

毫無疑問轉換建構函式就是建構函式的一種,只不過它擁有型別轉換的作用罷了。是否記得在c++之運算過載符(1)中兩個複數(sum=com1+com2)相加的例項,現在如果我想要實現sum=com1+5.5,那該怎麼辦,也許你首先會想到再定義乙個關於複數加雙精度的運算子過載函式。這樣做的確可以。另外我們還可以定義乙個轉換建構函式來解決上述的問題。我們對comlex類(複數類)進行這樣改造:

#include 

"stdafx.h

"#include

<

iostream

>

class

complex

//複數類

complex(

doubled=

0.0)

//轉換建構函式

complex

operator

+(complex com1);

//或friend complex operator+(complex com1,complex com2);

void

showcomplex();

};complex complex::

operator

+(complex com1)

void

complex::showcomplex()

intmain()

結果:

上述**在執行complex(5.5)時,呼叫了轉換建構函式,將double型別的5.5轉換為無名的complex類的臨時物件(5.5+0i),然後執行兩個complex類(複數類)物件相加的運算子過載函式。所以說一般的轉換建構函式的定義形式:

類名(待轉換型別)

轉換建構函式不僅可以將預定義的資料型別轉換為自定義類的物件,也可以將另乙個類的物件轉換成轉換建構函式所在的類的物件。

轉換建構函式可以把預定義型別轉化為自定義類的物件,但是卻不能把類的物件轉換為基本資料型別。比如:不能將complex類(複數類)的物件轉換成double型別資料。於是在c++中就用型別轉換函式來解決這個問題。定義型別轉換函式一般形式:

operator 目標型別()

目標型別是所要轉化成的型別名,既可以是預定義及基本型別也可以是自定義型別。型別轉換函式的函式名(operator 目標型別)前不能指定返回型別,且沒有引數。但在函式體最後一條語句一般為return語句,返回的是目標型別的資料。現在我們對complex類做類似改造:

#include 

"stdafx.h

"#include

<

iostream

>

class

complex

//複數類

complex(

doubled=

0.0)

//轉換建構函式

complex

operator

+(complex com1);

//或friend complex operator+(complex com1,complex com2);

operator

double

();//

宣告型別轉換函式

void

showcomplex();

};complex complex::

operator

+(complex com1)

complex::

operator

double

()//

定義型別轉換函式

void

complex::showcomplex()

intmain()

結果:

3.最後對型別轉換函式做幾點補充:

(1)型別轉換函式只能作為類的成員函式,不能定義為類的友元函式;

(2)型別轉換函式中必須有return語句,即必須送回目標型別的資料作為函式返回值;

(3)乙個類可以定義多個型別轉換函式,c++編譯器會根據函式名來自動呼叫相應的型別轉換函式函式;

補充過載運算子

補充過載運算子 過載運算子 1 只有那些包含使用者自定義型別的表示式才能有過載的運算子。return int 2 3 返回臨時物件。臨時物件必然是常物件,且不會執行析構函式,只需要乙個普通的構造函式呼叫。效率高,稱為返回值優化。operator 指標間接引用運算子一定是乙個成員函式,必須返回物件或引...

C 運算子過載之過載單目運算子

單目運算子只有乙個運算元,但是其過載方法類似於雙目運算子,在這裡以過載單目運算子 為例,介紹單目運算子的過載 注意 和 運算子有兩種使用方式,前置自增運算子和後置自增運算子,它們的作用是不一樣的,為了區分他們,c 約定,在自增 自減 運算子過載函式中,增加乙個int型別的形參,就是後置自增 自減 運...

C 之「運算子過載」

c 可以過載的運算子有 1.前置 和後置 2.前置 與後置 3.運算子 4.運算子 5.流提取與流插入 運算子 特別注意 要對類的物件使用運算子,不能過載的運算子 逗號運算子 includeusing namespace std class operate operate operate int x...