C 之類的自動轉換和強制型別轉換

2021-07-14 06:04:33 字數 2839 閱讀 7042

1.自動轉換

c++語言不自動轉換不相容的型別,例如,下面的語句:

int *p = 10;
是非法的,因為左邊是指標型別,而右邊是數字。不過在無法自動轉換時,可以使用強制型別轉換:

int *p = (int *)10;
上述語句將10強制轉換為int指標型別,將指標設定為位址10.

c++程式設計師可以指示c++如何自動進行轉換,或通過強制型別轉換來完成。在c++中,接受乙個引數的建構函式為將型別與該引數相同的值轉換為類提供了可能。

我們舉乙個例子來說明:以兩種方式(磅和英石)來表示重量。

程式示例:

stonewt1.h

definition for stonewt class

#ifndef stonewt1_h_

#define stonewt1_h_

class stonewt

; int stone;

double pds_left;

double pounds;

public:

stonewt(double lbs);

stonewt(int stn,double lbs);

stonewt();

~stonewt();

void show_lbs()const;

void show_stn()const;

//conversion functions

operator int()const;

operator double()const;

};#endif

stonewt1.cpp

class methods + conversion functions

#include using std::cout;

#include "stonewt1.h"

stonewt::stonewt(double lbs)

stonewt:: stonewt(int stn, double lbs)

stonewt::stonewt()

stonewt::~stonewt()

void stonewt::show_stn()const

void stonewt::show_lbs()const

stonewt::operator int()const

stonewt::operator double()const

demo.cpp

#include #include "stonewt1.h"

int main(int argc, char * argv [ ])

解析:

建構函式:

stonewt(double lbs);
用於將double型別的值轉換為stonewt型別,就是說可以這樣編寫**:

stonewt mycat;

mycat = 19.6;

程式將使用建構函式stonewt(double)來建立乙個臨時的stonewt物件,並將19.6作為初始值。隨後,採用逐成員賦值的方式將該臨時物件的內容複製到mycat中。

這一過程稱為隱式轉換,因為它是自動進行的,而不需要顯示強制型別轉換。不過這種自動轉換並非總是合乎需求的,因此,可以使用乙個關鍵字(explicit)來關閉這種自動特性。即可以這樣宣告建構函式:

explicit stonewt(double lbs);
這樣將關閉上述範例中介紹的隱式轉換,但允許強制型別轉換:

stonewt mycat;

mycat = stonewt(19.6);

mycat = (stonewt)19.6;

注意:只接受乙個引數的建構函式定義了從引數型別到類型別的轉換。如果使用了關鍵字explicit限定了這種建構函式,則它只能用於顯示轉換,否則也可以用於隱式轉換。

2.轉換函式(強制型別轉換)

上述程式將數字轉換為stonewt物件,其實也可將stonewt物件轉換為double值,但不是使用建構函式,必須使用特殊的c++操作符函式--轉換函式。

轉換函式的格式:

operator typename();
例如,轉換為double型別的函式的原型如下:

operator double();
解析:

typename(這裡為double)指出了要轉換成的型別,因此不需要指定返回型別,轉換函式是類方法意味著:它需要通過類物件來呼叫,從而告知函式要轉換的值。因此,函式不需要引數。

注意:轉換函式必須是類方法。

轉換函式不能指定返回型別。

轉換函式不能有引數。

總結:c++為類提供了下面的型別轉換:

1.只有乙個引數的類建構函式用於將型別與該引數相同的值轉換為類型別。例如,將double值賦給stonewt物件時,接受int引數的stonewt類建構函式將自動被呼叫。不過,在建構函式宣告中使用explicit可防止隱式轉換,而只允許顯示轉換。

2.被稱為轉換函式的特殊類成員操作符函式,用於將類物件轉換為其他型別。轉換函式是類成員,沒有返回型別、沒有引數、名為operator typename(),其中,typename是物件將被轉換成的型別。將類物件賦給typename變數或將其強制轉換為typename型別時,該轉換函式將被呼叫。

C 型別的自動轉換和強制轉換

int a 12 a 22.5 a int num int 99.5 int num2 int 99.5 兩種寫法都正確將浮點型變數賦值給整型變數時,捨棄小數部分 將整型資料賦值給浮點型變數時,數值不變,但是以指數形式儲存 將double型資料賦值給float型變數時,注意數值範圍溢位 字元型資料可...

c 類的自動型別轉換和強制型別轉換

下面討論類的型別轉換。我們先來看看c 是如何處理內建型別轉換的。將乙個標準型別變數的值賦給另一種標準型別的變數時,如果這兩種型別相容,則c 自動將這個值轉換為接受變數的型別。double time 11 int value 11 converted to type double利用建構函式將內建型別...

C 中的自動型別轉換和強制型別轉換

前面已經認識了不同的資料型別,你們有沒有嘗試過讓不同的資料型別進行運算呢?inmwywfswfnft a 1 double b a console.writeline b 執行結果是 1 我們把乙個整型的變數賦值給了乙個浮點型的變數,可以正常的輸出,如果我們把乙個浮點型的變數賦值給乙個整型的變數呢?...