星期三, 3月 07, 2007

implicit conversion

在書上看到以下程式碼(有經過微修)


class complex {
double re, im;
public:
complex (double r = 0, double i = 0) : re (r), im (i) {}
// following skip
};

void f (complex z) {
complex a = 2.3;
complex b = 1/a;
complex c = a + b * complex (1, 2.3);

//.....
}

標示為紅色的部分令我感到訝異,這真的能執行嗎?
因此我自行寫了 test code,果真可以。

每個變數都需以 constructor 初始化,但 complex並非 base type,因此宣告時的 =(assign)與 () (initialization) 是不同的。由於 complex a = 2.3; 的結果與 complex a (2.3); 相同,因此我最初假設這兩行 statament 的意義是一樣的。後來我想到在 constructor 前加上 explicit,預料中的事發生了,原先 compile OK 的 code 出現 error。

在短短一行 complex a = 2.3 牽涉到:

1、implicit conversion
把 double type 2.3 轉換成 complex(這中間呼叫了 constructor)

2、initialization
喚起 copy constructor 初始化 a;

加上 explicit 後 error 的原因在於,explicit 會禁止藉由此 constructor 做 implicit conversion,除非使用者明確要求轉換,也就是 complex a = static_cast < complex > (1.2);

--
還好還記得,不然會被向上學長吊起來 XD

沒有留言: