- 在线时间
- 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>2 Y- ^# J {+ A1 o3 }9 Q* V
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:# w/ T; c4 B: `- U. \- T
6 C) q" L& r2 _- W: m6 e$ y, V6 u
class C {% s: z5 O! v/ g$ ?
int i;
: K u) a9 ~( K8 m& X2 c; a( K//...
" o- _! j; |& i7 i) @, kpublic:- Y* c4 W8 ?3 ^+ G3 B- Q1 p2 a# n
C(int i);//constructor and implicit conversion operator
- R' N1 X. f9 i3 F2 x- N }//as well6 t/ U1 l8 Z# f' Z
};
/ @# r3 S& y, J G' \6 {) N
: u; p7 @" i* D9 _ k5 \! Nvoid f() {# C+ I' d0 v8 J# Y: g7 {0 X5 v
0 O7 T/ q2 U7 Z$ _! Q& [ v
C c(0);3 @5 Q7 f1 @" F6 x" ]
0 L( {, C) A3 F" F" i
c = 5; //将 5 隐式转换为 C 对象,然后赋值. Z& Z3 E& Q; ~5 n3 ]
1 l0 |- U4 ]5 G5 Y! D# C0 D2 J}
9 R( A+ h9 |# V: {- H* s" k3 h. w' i8 B& T0 J# t
编译器重新编辑上述例子代码,如下: . n" G9 N2 u- `2 @
* I9 @, T: i# |/ [//////////////////////////////////////////////////////////////////////////////////////////+ T- F% w8 w- @8 v% {
//"c=5;" 被编译器转换成下面这个样子:; r$ {1 E$ F( ~( C3 j' a
/////////////////////////////////////////////////////////////////////////////////////////! N' p/ x. ^0 h Q% x
+ R! A8 M. E9 z4 H$ ` M m
C temp(5);// 实例化一个临时对象,
2 z$ ]4 Q! y# y6 e# _* Wc = temp; // 用 = 赋值
& M6 P3 V2 R: h* ctemp.C::~C(); // temp 的析构函数被激活
: n4 K0 g8 S9 E) I4 p( p# u4 j. o2 d% p3 O& S5 y$ M) A- C6 H
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:. t- `! x* B1 s& B" V4 S' U8 L
' V; A& u3 U2 c& ~5 ~5 V
class String {5 d9 I% A/ K J- P8 L3 S+ Q5 Q
int size;
% B p' m8 }: ~5 {9 a7 Rchar *p;- h* j ^" |* s& b
//..+ E4 S4 o6 G8 [* [: e+ O O* ]
public:8 ~+ i/ C2 w; D3 P9 F, @
String (int sz); //这里不希望进行隐式转换操作0 X3 l& I- N# E. q
};
0 X% J) W; L* F: [void f ()
+ L. {* ]' e7 g9 `{
0 U* R/ Z4 F0 N4 I+ L2 x1 W String s(10);6 Y, \& T! g" S# ^
; s( e0 h! d4 `& U! x // 下面是一个程序员的编码;发生一个意想不到的转换:! U3 j( `" u& s; G: ~9 ^
! l+ J* G0 u# r4 R9 X/ |3 Z s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s) X- A) g7 G) {
} 8 v" C" q! K, ^3 f$ D
* y6 x/ {8 E0 P1 ]
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
9 B1 _ q0 |1 k$ a8 x! [- `1 i- ^0 ?$ A7 M* d, |# z
class String {
5 ?6 v! q% [5 U: O! U/ [int size;8 D+ `+ q! y" o' C) r4 l
char *p;% c. A/ X$ h) D* D0 j
//..
: Z2 T# B+ E; X& _" W$ cpublic:
8 G' @# `: W4 M! O // 不要隐式转换
' c0 i8 L. q c' A explicit String (int sz); `8 r' Q9 }5 C* |. a
String (const char *s, int size n = 0); // 隐式转换
! O0 l$ M3 p0 ]7 |: {0 ~};& p- D" ~6 i# B! Y: G
9 s. n" Z* a0 svoid f ()
6 q/ h( a* `! [3 N{4 W1 C2 Y! `6 e
String s(10);( Z9 L7 c3 C6 m C
& l) c1 ^- j, u: F+ k s = 100; // 现在编译时出错;需要显式转换:
0 `5 ?, i. q# V8 O$ B& Q) C, N9 W/ \, n4 w# f8 K8 w7 O" H1 c P
s = String(100); // 好;显式转换% ]) Z) i% o" w6 k. i, {
s = "st"; // 好;此时允许隐式转换+ I3 n- d/ w# l2 r- N# I6 Z" Y
} |
zan
|