- 在线时间
- 0 小时
- 最后登录
- 2005-9-21
- 注册时间
- 2004-4-27
- 听众数
- 1
- 收听数
- 0
- 能力
- 0 分
- 体力
- 1027 点
- 威望
- 0 点
- 阅读权限
- 40
- 积分
- 385
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 153
- 主题
- 43
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   28.33% 该用户从未签到
国际赛参赛者
 |
< align=center><FONT color=#0033ff><B>认识 C++ 中的 explicit 关键字</B></FONT># w& o; N( p, y
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:- C- T" j$ k! F; j q
) u! z6 G+ g, w1 x3 o7 c1 u/ t. Q- z
class C {
1 x0 o& E9 `, `int i;- ^0 z: r/ Z7 H7 O: t; i
//... Y. G* n% N5 O6 i6 v
public:0 S. c3 ~# E" N3 [: @) L9 b1 {
C(int i);//constructor and implicit conversion operator
! ~ Q: J; S+ p- _$ l//as well
* H* Y/ p- M M};, R$ T7 N- n3 h' P6 }
# {3 f; r4 b8 n0 U+ i: C' Dvoid f() {+ I1 z( d5 \3 T- y" D& N4 @9 w
0 k* s7 M! k- n( F6 K' n
C c(0);) G9 b9 B: H- I! v, Q8 c2 {
( L7 u$ u$ @0 D: p2 R
c = 5; //将 5 隐式转换为 C 对象,然后赋值
. o' [) u$ q: P5 g' O) _7 f. g; F# L5 g$ @8 D- M
}
3 N& Q# U" q. U2 p: L, a& A* }5 Q) H6 S' Z+ h, N) K
编译器重新编辑上述例子代码,如下: # K: y* I9 ^! O4 n
* P Z. O/ B5 F9 X
//////////////////////////////////////////////////////////////////////////////////////////5 e& H; r5 A I8 f1 c7 @* Y
//"c=5;" 被编译器转换成下面这个样子:* m- S9 H* c; J! z% U; ]
/////////////////////////////////////////////////////////////////////////////////////////4 `$ Q0 I! y& \+ T5 b' h7 Z, l ~
% W$ B* q c7 W9 v/ q5 t2 c0 `5 dC temp(5);// 实例化一个临时对象,
1 q3 S7 O( `: u0 {0 w R6 K4 d7 I- kc = temp; // 用 = 赋值
" d6 [) G! S( w4 M! X6 rtemp.C::~C(); // temp 的析构函数被激活
# L3 ]! o& a+ C8 o& M! W% Q- _1 F( \/ u) V
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
- W4 e1 ^5 b& V7 ]$ ^
# A% Q0 U% Y& ^! a% I5 }/ J% r4 T5 n$ \class String {
5 D4 e; B' k+ o9 gint size;
" d4 P9 Y: X6 u) q; m# o' }char *p;
- N8 G* z7 F6 g; n+ C- D" n//..
" e& u6 \& h9 O; _6 [+ Gpublic:+ }$ H/ j% q& i. a% _- V
String (int sz); //这里不希望进行隐式转换操作
$ q3 i2 b! i2 Y& [' i! @3 P; P};
9 I, | U- p3 B7 {, T7 X/ C( ovoid f ()
: }5 U2 b+ Y( f0 S) X$ f0 S; N0 y{
f# B: u6 w3 b. I8 ]- m String s(10);; [6 T& y2 a; q/ I4 {
3 U; b# i, ?8 j( v // 下面是一个程序员的编码;发生一个意想不到的转换:
" z7 [6 v$ |8 [' M; W# t' W* _0 J/ ~) N+ R+ h0 F c
s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
6 ^6 Y( O9 s% u) J}
% V: h# x; ?/ ~; q9 b8 O" h3 a. O/ |7 P; H4 B
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:% n6 q; L7 ?# }' Y ?
1 a( Z4 x4 ~/ C! N; h1 `class String {) @( N2 U% [: ^1 m& U( ?3 f8 l; @; Y
int size;
$ r0 v% w5 |7 e+ s& Uchar *p;
' l7 y" r4 s4 q3 U. ]: C/ H; z) s//../ L P8 f, k- e, C8 B# o
public:2 c9 i' u( l4 m7 L/ \6 E w- \
// 不要隐式转换
5 i% E( O/ b% y explicit String (int sz);
( Q: f1 o7 }) w; i6 v6 ` String (const char *s, int size n = 0); // 隐式转换) h" ?; J- C U+ V; n. Q4 K' K, e
};
/ D4 M/ o" _7 {. g0 ?
" u6 Q- o8 ^3 Q/ R. u( E" O% ]void f (); @ B' J6 y6 t& D! i0 t! m' C
{! ?% C4 T0 {8 T% g1 }! d
String s(10);
+ d/ r5 u* O7 ^
# p( X8 ?7 c2 M8 j; {7 A5 b! a s = 100; // 现在编译时出错;需要显式转换:' a4 n5 K4 k6 h; D5 x+ ^0 H6 T
; x6 F: b/ ^4 M
s = String(100); // 好;显式转换1 c ^# i7 f$ Z+ P4 e+ i
s = "st"; // 好;此时允许隐式转换
( g, a' s" w$ |; m( u6 K} |
zan
|