程式設計課時老師給出了關於建構函式與型別隱式轉換的乙個例子:
設對以下複數類:
#include
using
namespace std;
class
complex
complex operator+(
const complex &other)
intget_real()
intget_imag()
private
:int real;
int imag;};
intmain()
在devc++中編譯通過,輸出為:
423
2
但是,我們在類的定義中所定義的complex operator+(const complex &other),該函式需要傳入的引數應該是乙個complex類, **sum2=a+2應該不能執行,因為他傳入的是乙個int引數。
而該**可以編譯通過並得到正確答案的原因在於:在執行 sum2=a+2;這段**時,發生了隱式轉換,即呼叫了建構函式將int形物件2轉換為了complex類,之後再進行運算。能呼叫建構函式的原因是該建構函式已經為real和imag提供了預設值,故只傳入乙個引數2,也可以呼叫建構函式complex(int a = 0, int b = 0): real(a), imag(b) {};
若將建構函式改為以下形式:
complex()
:real(0
),imag(0
)complex
(int a ,
int b )
:real
(a),
imag
(b)//下方對b的初始化也需改為complex b(3,0)
此時再執行程式,sum2=a+2處會報錯:no match for 『operator+』 (operand types are 『complex』 and 『int』); 是因為此時沒有相應的函式可以隱式的把2轉化成complex類了。 建構函式隱式轉換
建構函式會引起乙個不引人注意的問題 用單個實參來呼叫的建構函式定義了從從形參型別到類型別的乙個隱式轉換。舉個例子說 cpp view plain copy class sales item sales item add sales item other sales item const std st...
C 轉換建構函式和隱式轉換函式
其實我們已經在c c 中見到過多次標準型別資料間的轉換方式了,這種形式用於在程式中將一種指定的資料轉換成另一指定的型別,也即是強制轉換,比如 int a int 1.23 其作用是將1.23轉換為整形1。然而對於使用者自定義的類型別,編譯 系統並不知道如何進行轉換,所以需要定義專門的函式來告訴編譯系...
C 轉換建構函式和隱式轉換函式
本文的所有內容均來自 今天是第一次聽到c 還有個轉換建構函式,之前經常見到預設建構函式 拷貝建構函式 析構函式,但是從沒聽說過轉換建構函式,隱式轉換函式也是一樣,c 的確是夠博大精深的,再次嘆服!其實我們已經在c c 中見到過多次標準型別資料間的轉換方式了,這種形式用於在程式中將一種指定的資料轉換成...