, l. r0 q( g; U0 L" `在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:* j" Q- c7 i; x& @% D
1 X8 @, }) @* ~
class String {$ x; X r6 F6 c( T- j1 a
int size; ; N$ d$ t0 I! ?! r7 O' Nchar *p;$ Z+ ^3 T8 b X9 i- S
//..4 l8 k1 n4 E' S% ?" k
public: 6 o$ \$ r2 n9 a% b( J4 `$ R8 J, r String (int sz); //这里不希望进行隐式转换操作 ; i# \+ [1 {) S7 U# w% i8 E}; & b* S* h' r# U5 Yvoid f ()# q# b, [$ E9 U6 P& n* c2 M; Q" a
{+ O0 V% R: W( E( m0 d/ F! g* r
String s(10);7 R0 C" |0 e* s {# B3 |: D
% Z9 a$ W. V7 \" B- |. W // 下面是一个程序员的编码;发生一个意想不到的转换:( ?5 @6 P* P. \, i; g6 l$ H' j
6 _3 h; Y: S9 R# ~7 O5 P0 e
s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s ( L. X" P* x6 _3 J+ K} ( l2 B' M, a, |7 Z* K
3 h; p, F% E# o为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:- Z# u4 K$ i+ ]. t# Y ]% [
4 o# r6 X; Q. P2 m
class String { % S3 F1 e5 t9 ~int size;5 w# Q/ }. \9 p; w. H
char *p;3 c7 X# h+ O2 c G' H& L" u
//..) q) N8 F8 z9 J6 C
public:9 K& ]# V% ?/ j
// 不要隐式转换 " X( Y( o5 n0 I; n' o4 J explicit String (int sz); " v/ `# ~& t. t/ L7 M( ^0 `& D# j; @ String (const char *s, int size n = 0); // 隐式转换+ N, T: I+ t$ n; }, Y( J
};/ U# x4 O: e i; i, u3 O
7 B/ n$ e$ e8 ^7 {. T* yvoid f () # H# K. F4 Q$ v! u6 U5 b0 ]{- U0 ]: g1 B! g
String s(10); 5 p$ `' T8 J0 E5 h- Y * m4 d* f0 h& q( l3 X" k+ ^5 _ s = 100; // 现在编译时出错;需要显式转换:" t9 O/ h g6 T; a& i' ?
- Y2 ^4 w7 p& p1 g: ] s = String(100); // 好;显式转换" d. R% O" P* f" [+ J& b
s = "st"; // 好;此时允许隐式转换5 K% j( g' m1 L- {7 y) ~- M) h
}