類的自動轉化和強制型別轉換(C )

2021-08-28 06:44:11 字數 3675 閱讀 3920

可以將類定義成與基本型別或另乙個類相關,使得從一種型別轉換為另一種型別是有意義的。

當乙個類的建構函式中,有只有接受乙個引數的建構函式,這個建構函式就能作為轉換函式。

#pragma once

#ifndef stonewt_h_

#define stonewt_h_

class stonewt

; int stone;

double pds_left;

double pounds;

public:

stonewt();

stonewt(double lbs);

stonewt(int stn, double lbs);

virtual ~stonewt();

void show_lbs() const;

void show_stn() const;

};stonewt::stonewt()

stonewt::stonewt(double lbs)

stonewt::stonewt(int stn, double lbs)

stonewt::~stonewt()

#endif // !stonewt_h_

其中,stonewt(double lbs)這個建構函式可以作為轉換函式,即我們可以這樣:

stonewt mycat;

mycat = 19.6;

即為

stonewt mycat = stonewt(19.6);
然而,如果給第二個引數提供預設值,它便可用於轉換int

stonewt(int stn, double lbs = 0);
將建構函式用作自動型別轉換函式似乎是一項不錯的特性。然而,當程式設計師擁有更豐富的c++經驗時,將發現這種自動特性並非總是合乎需要的,因為這會導致意外的型別轉換。因此,c++新增了關鍵字explicit,用於關閉這種自動特性:

explicit stonewt(double lbs);
這將關閉上述示例中介紹的隱式轉換,但仍然允許顯式轉換,即顯式強制轉換。

然而,當且僅當轉換不存在二義性時,才會進行這種二步轉換,也就是說,如果這個類還定義了建構函式stonewt(long lbs),則編譯器將拒絕這些語句,可能指出,int可被轉換為long或double,因此呼叫存在二義性。

既然可以將數字轉換成stonewt物件,那麼可以做相反的轉換嗎?也就是說,是否可以將stonewt物件轉換為double值,就像如下所示:

stonewt wolfe(285.7);

double host = wolfe;

可以這樣做,但不是使用建構函式,建構函式只用於從某種型別轉換到類型別的轉換。要進行相反的轉換,必須使用特殊的c++運算子函式——轉換函式。

轉換函式是使用者定義的強制型別轉換,可以像使用強制型別轉換那樣使用它們。例如,如果定義了從stonewt到double的轉換函式,就可以使用下面的轉換:

stonewt wolfe(285.7);

double host = double(wolfe);

double thinker = (double)wolfe;

也可以讓編譯器來決定如何做:

stonewt(20, 3);

double star = wells;

編譯器發現,右側是stonewt型別,而左側是double型別,因此它將檢視程式設計師是否定義了與此匹配的轉換函式。(如果沒有找到這樣的定義,編譯器將生成錯誤訊息,指出無法將stonewt賦給double。)

要轉換為typename型別,需要使用這種形式的轉換函式:

operator typename();
注意:

例如,轉換為double型別的函式的原型如下:

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

stonewt.h

#pragma once

#ifndef stonewt_h_

#define stonewt_h_

#includeclass stonewt

; int stone;

double pds_left;

double pounds;

public:

stonewt();

stonewt(double lbs);

stonewt(int stn, double lbs);

virtual ~stonewt();

void show_lbs() const;

void show_stn() const;

operator int() const;

operator double() const;

};stonewt::stonewt()

stonewt::stonewt(double lbs)

stonewt::stonewt(int stn, double lbs)

stonewt::~stonewt()

void stonewt::show_lbs() const

void stonewt::show_stn() const

stonewt::operator int() const

stonewt::operator double() const

#endif // !stonewt_h_

假設有以下**:

stone.cpp

#include#include"stonewt.h"

int main()

下面是程式清單的輸出:

如果將cout << "poppins: " << (int)poppins << "pounds.\n"的(int)去掉,因為在cout示例中,並沒有指出應轉換為int還是double型別,因此不可行,程式中出現了二義性。

但如果類只定義了double轉換函式,則編譯器將接受該語句。這是因為只有一種轉換可能,因此不存在二義性。

賦值的情況與此類似。對於當前的類宣告來說,編譯器將認為下面的語句有二義性而拒絕它:

long gone = poppins;
在c++中,int和double值都可以被賦給long變數,所以編譯器使用任意乙個轉換函式都是合法的。

當類定義了兩種或更多的轉換時,仍可以用顯式強制型別轉換來指出要使用哪個轉換函式。

和轉換建構函式一樣,轉換函式也有其優缺點。提供執行自動、隱式轉換的函式所存在的問題是:在使用者不希望進行轉換時,轉換函式也可能進行轉換。因此,最好使用顯式轉換,而避免隱式轉換。在c++11中,可用explicit將轉換運算子宣告為顯式的。

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

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

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

1.可以將類定義成與基本型別或者另乙個類相關,使得從乙個類轉換成另外乙個型別是有意義的。2.將基本型別轉換成類 下面以double轉換成money類來舉例 假設定義了如下類 class money 則其中的建構函式money double r 可以講double型別轉換成money類這個型別。只有接...

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

內建型別轉換 將乙個標準型別變數的值賦給另乙個標準型別的變數時,如果這兩種型別相容,則c 自動將這個值轉變為接收變數的型別。eg long cout 8 int型的8將被轉換為long double time 11 int型的11將被轉換為double int side 3.33 double型別的...