* @! Y) ~2 V7 m, L! o9 k; [class C {8 M5 e/ Y' V" f; a
int i;: m) {. a; Z# m) g3 }
//... 8 Q- s; @6 r& e, dpublic: 3 ~3 X( z0 ` {3 W' \ C(int i);//constructor and implicit conversion operator 7 \; N/ M! p6 d: j//as well, h3 ]4 d7 y( h, P% f0 y; k) o+ A
};. {$ B! q5 K& B* n# s1 T' N6 _# ]% u
+ G. F7 b \% w8 F7 p$ _3 C0 Gvoid f() { - m7 o) s" O7 { & i" W8 C- k9 C1 l2 PC c(0);! H, i' G" a' F1 t' w G
* g$ R8 j/ [3 W+ h; i4 \& M
c = 5; //将 5 隐式转换为 C 对象,然后赋值 [ F' H5 O/ N+ y, L0 b
& C) l4 V" [7 E7 J: [: L
}6 n. W0 V+ S( d7 R9 Z1 h2 v3 H
9 P% z, f# Q/ d8 X编译器重新编辑上述例子代码,如下: : K5 Z5 l+ e" R
3 }; T: }' W3 G f$ b0 u
//////////////////////////////////////////////////////////////////////////////////////////) x3 ?5 ?* o& e) `8 B. N
//"c=5;" 被编译器转换成下面这个样子: 0 X- M' a1 a/ u6 e3 m" Y% l/ s///////////////////////////////////////////////////////////////////////////////////////// + v5 d4 s* R6 G% _4 X( k& o- B2 H( b* s
C temp(5);// 实例化一个临时对象,6 }7 V/ B; e% C3 f" E% N ~
c = temp; // 用 = 赋值 8 G" B/ A6 G5 D( {0 E x8 Ztemp.C::~C(); // temp 的析构函数被激活 3 a/ ^' B% i) G$ V4 r$ |, o) L3 v G, w/ D$ w# t
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如: # E5 ~0 A8 f4 b! r8 y* o9 K2 V/ u
class String { . K; o: x9 ~$ hint size; 7 i, b" g& I7 n6 M* P# ? m6 rchar *p; " [& E& n# o/ i( B//.. ! j% E5 B6 T4 _! ppublic: ' x' k# b! H7 Q6 O+ c5 ^0 v$ w6 H String (int sz); //这里不希望进行隐式转换操作 & v* `) k# F* L; _& Q}; 2 I2 G ]- v8 _8 j) svoid f ()7 A- t' @- Q2 p+ u+ B/ R. r+ T
{ . U, N* y5 \1 k7 r String s(10); 8 n3 L# `7 i, _, x9 k. d! q0 E- x, T- h( j4 w
// 下面是一个程序员的编码;发生一个意想不到的转换: G0 I+ b3 T& y+ T8 G- J6 Y
) b: l! ?& a( {: e
s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s1 D6 O, X1 P8 t; Z9 M
} r6 U, R# K, q/ H, O/ x* I3 r1 C3 L