数学建模社区-数学中国

标题: [转帖]认识 C++ 中的 explicit 关键字 [打印本页]

作者: xShandow    时间: 2004-12-31 08:54
标题: [转帖]认识 C++ 中的 explicit 关键字
< align=center><FONT color=#0033ff><B>认识 C++ 中的 explicit 关键字</B></FONT>
! `+ e( t% l2 g" g% U( ](Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
1 ^% H6 g7 Q' c: o  N2 E
% Q5 v5 i/ L4 b6 i/ C% ?3 a: M3 kclass C {
+ F9 e  O  E/ M4 k  W; m1 x! G, t* zint i;
, m, }, R: i8 a; W//...
" Q- u* ?  i6 Z2 b9 O  {  Tpublic:
8 ^' _0 b6 Q; q' ]; o      C(int i);//constructor and implicit conversion operator
" e$ y, p, [3 Y  m8 g//as well
  X$ I6 k  O, u/ [};
, a: ?* I4 {: M# E+ e, F
/ I' U. C3 B0 J0 E0 N" k! ?5 svoid f() {
9 T$ @1 n! l5 u2 y5 R0 F/ H
: Y5 U4 k7 ]6 i" W9 ]C c(0);: F8 }# \/ A* J

. i# K+ f1 \$ j1 `. {7 n- uc = 5; //将 5 隐式转换为 C 对象,然后赋值: d" Y. k, C& f8 X9 i0 Z; ]

0 c) f6 f# C& A' M2 [; u}" W/ H5 l$ H1 ?' Q; ?% w0 ]

. O' \5 |- o6 Q# C编译器重新编辑上述例子代码,如下: 1 V2 Z# k6 E) @& z' Z: S, i

0 L$ @* I7 e  x- @" \//////////////////////////////////////////////////////////////////////////////////////////
1 k8 A1 ?# o' v//"c=5;" 被编译器转换成下面这个样子:
: z1 p1 {" @- o/////////////////////////////////////////////////////////////////////////////////////////
1 p- S# b( V+ g) \2 v$ F1 F4 Z1 k. M5 {5 y
C temp(5);// 实例化一个临时对象,
0 I) n9 ^) J0 W+ @# g8 Nc = temp; // 用 = 赋值
" [6 d  M# M3 L, A+ `; t# c9 x" Otemp.C::~C(); // temp 的析构函数被激活+ K4 G" x- Z$ N# U( O

* O( Q+ F* ~: j在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
- v3 e4 n3 F, U
* G2 O8 j6 @: b. xclass String {' n: }3 }- t( L6 M4 K
int size;2 J8 r2 C6 _7 X' L4 G1 W' t
char *p;
; w" O7 f" d5 a2 V, n& E//..
' j" R. E$ c+ A7 Ypublic:
( P, V3 \2 D2 ?) ]" N! R4 v. z0 F& \       String (int sz); //这里不希望进行隐式转换操作: W6 {' r3 y. U4 k( p
};
3 a. |0 z' W2 {9 J* m- }void f ()" L7 z3 {) ?! l1 `/ o; d1 v
{" w( N9 U( E" w+ R9 r: _- Y$ [" G$ W. W
    String s(10);
, B% _" j, ~0 N3 h2 K/ @$ C& N$ y+ z* b: U
    // 下面是一个程序员的编码;发生一个意想不到的转换:
7 A9 o, i: g" K( L. ]1 ]
& l; W; n  c- H) [7 ]    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s: Y# [, R7 Z" s0 t4 h  L( N" \
}
5 Z- b( w1 X! K4 `- _1 E4 M' }
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
# d/ z: I1 v& ^$ S6 A4 ^: S: n
: Y/ W4 ~  S, E: u' yclass String {
& |6 b; f, L3 {& k& ~* v5 Oint size;3 p, R/ e& a; D) \6 g7 Y
char *p;
' Q' A* i3 b/ O6 H. }) D0 _//..# T  K7 ~6 C4 V  G3 I
public:
& N1 ]9 H. K, ~  I* J5 }       // 不要隐式转换* q3 y# v- j9 O$ Z* A/ \
       explicit String (int sz);
: V( x1 m: ~9 C, L" b5 b" Y, S       String (const char *s, int size n = 0); // 隐式转换# P8 c) K0 l; I. b5 H8 Z( F. O
};; h% e- e9 |% c1 }
+ d# Q; O5 c% ]* }2 ]3 V' d' L
void f ()" b( `1 d+ V- }- ]' _3 q
{4 E+ k7 ?3 {8 c; Y
    String s(10);1 C8 U8 H, G- n' H' L
) u$ I  y% d& ?% p. _5 }
    s = 100; // 现在编译时出错;需要显式转换:
1 n! p* M  _& o1 Z+ I3 h# k
: M- I, N! E9 |: A- \( ]3 u4 u    s = String(100); // 好;显式转换: u2 V  p( V* @, W
    s = "st";        // 好;此时允许隐式转换
" [$ E5 b; Z5 h: i9 I}
作者: jiner    时间: 2005-4-1 06:01
<H2>我在发贴时怎嬷老发不出啊</H2>
作者: csenml666    时间: 2005-6-18 07:14
<>回复论坛有点数吗</P>
作者: txj66    时间: 2005-8-22 01:58
<>谢谢</P>
作者: husir1983    时间: 2006-3-2 09:06
ding
作者: sabbanji    时间: 2006-11-21 04:47
  版式不好,看不清楚。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5