- 在线时间
- 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>
; v) d4 ~3 R) u6 g7 _(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:# ? Y: M0 P0 ]' N
) ^+ Y( d/ V! `6 c7 k; f
class C {. i. t9 X# t" s3 q) ^
int i;) y- h" V8 b# ^4 }
//...
# d7 e, p U5 D" l# H% Ppublic:
) K; J! g+ z2 c5 z! p C(int i);//constructor and implicit conversion operator p: R! ]2 S% `1 L
//as well6 D" E2 H+ \4 N7 o: i6 ^
};
# l" ^/ _3 A1 _/ o4 Z. Y) l: m& E6 Q5 a5 d. v- Z
void f() {
- ~% j/ C% R& q; x; R( p+ Q0 h* R C5 N0 [1 V; S4 d
C c(0);
+ \- M" d/ x4 K. p' `* s4 D% y$ F
+ K( u- W5 a% \7 b: `' Pc = 5; //将 5 隐式转换为 C 对象,然后赋值
- L8 G. m$ D* D) d/ Y) M5 X' ^) G! l$ {7 q# P1 k/ q* h4 L
}
; ?3 H4 S U) w$ t ^! K/ \
/ Y- N h1 Q# }) g; i编译器重新编辑上述例子代码,如下:
1 z/ g7 m" W; [, x: s, r% u' m! b4 D* a# w' W2 z
//////////////////////////////////////////////////////////////////////////////////////////
J0 z: f4 h6 Q, V; [//"c=5;" 被编译器转换成下面这个样子:
- r0 S/ B0 C+ f/////////////////////////////////////////////////////////////////////////////////////////
* n- u9 x, U) D) ]1 j* o9 u! M$ y9 |3 N- _
C temp(5);// 实例化一个临时对象,0 y Y! p- u6 N1 y; b
c = temp; // 用 = 赋值3 k! N; I6 X: R
temp.C::~C(); // temp 的析构函数被激活
" l7 l# V1 `& o. |$ b
/ T* n( j- l$ S$ M$ e在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:5 _; g8 R2 M: p
2 g* F5 Y1 }3 R1 p2 K! |) F5 ^class String {
, ^& G. Y8 B/ y7 v, cint size;
% ~, {' \# p% a H: cchar *p;# o! c: O1 y! ?- b2 i; C
//../ r5 g6 p: p4 O2 y5 R4 } t! Y- |
public:
$ m/ u2 g: ]3 B: J& D String (int sz); //这里不希望进行隐式转换操作: @# v, `/ T' ~( E: x
};" y( {+ T0 K* d! }8 O
void f ()
8 G v* b$ ~1 w{
; l. j% I& c, q! q( E% h6 R, j) e; o8 i) e String s(10);7 V; }- T$ K, b$ ^, q) z' ~
9 C' Q7 r N) w7 ?" y( ~, I // 下面是一个程序员的编码;发生一个意想不到的转换:( B1 j: {& O# B- X+ f! { i5 a1 g
2 b1 {$ Y2 j- A/ ^
s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
8 T! K f+ d3 X) D7 W8 N} & {& ^: G; g+ v7 R: r3 J+ ~2 E6 ]- z' _
5 t/ h. T1 J' f, c2 Q为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:4 Z7 ^ q* t; t( V1 |
! c( H9 I7 B) Mclass String {
# v: Y" h; u4 N, u2 x( [2 k( jint size;6 ?" _) @0 U* N" d" O( o0 a, X
char *p;
% ^1 w$ z: [* E( f# F//..9 p3 f7 w- ]* E
public:
' P y/ P# w1 u. n- s // 不要隐式转换
0 a) u! \ L( T$ N5 B explicit String (int sz);
& s1 n0 c' L/ B8 j String (const char *s, int size n = 0); // 隐式转换
& P5 l, T" S2 Q, i/ I6 [" Y1 Z};- k% g4 L0 v9 {0 w
6 D6 K l7 T+ C. d+ L
void f ()
: }8 a/ T! l- ^{
; c3 ]7 I$ S" W1 C' }# ] String s(10);
0 }+ t! }9 y8 c1 d
3 F5 o# N' H& K s = 100; // 现在编译时出错;需要显式转换:
1 s# f" @- J9 @7 K6 ^8 G( T) Y) O; z
s = String(100); // 好;显式转换 P- r) z a* H2 t- Q
s = "st"; // 好;此时允许隐式转换
! ^* [* u/ `0 Y) v. E: L} |
zan
|