数学建模社区-数学中国

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

作者: xShandow    时间: 2004-12-31 08:54
标题: [转帖]认识 C++ 中的 explicit 关键字
< align=center><FONT color=#0033ff><B>认识 C++ 中的 explicit 关键字</B></FONT>
3 ^( M6 Y: j& v+ {(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
4 d- h0 Y% H1 b9 ]& P  h$ J" K9 j$ A6 y6 M0 X' d4 g2 x; n+ s
class C {" a" C$ a/ i! B' ^) r
int i;
2 T  `( \6 Q! {* ]* @3 X6 M//...
7 k& z5 r( X, s/ V5 q  Vpublic:5 w, ~8 |3 z2 S2 g
      C(int i);//constructor and implicit conversion operator( ]/ m0 Q9 s' N; y: j
//as well0 j$ k- E2 X7 M$ n, U3 Q' U
};
) z3 G2 ?! C, c1 Y6 s( T5 j. ]: C4 @" m; I# s
void f() {! M$ R; J+ {9 u
& R, }* y$ ?3 Y* g; n9 r
C c(0);
" y3 y+ d5 z$ [
8 ]" U7 m( Q# M7 L+ B# ]c = 5; //将 5 隐式转换为 C 对象,然后赋值) K/ g- w6 L; k9 `
' l0 z4 B3 |' H0 L
}
  O9 r, I9 L! r$ n8 j. ?8 Y9 O  E( ~' L  }8 n
编译器重新编辑上述例子代码,如下:
/ Y3 K. g0 l+ N9 I4 M* q* |9 \' H- o6 M7 K
. Z& R9 R- d) `" x//////////////////////////////////////////////////////////////////////////////////////////
1 U* Z2 `8 t  e$ ~" n" `//"c=5;" 被编译器转换成下面这个样子:% T4 q% E4 x, s/ X
/////////////////////////////////////////////////////////////////////////////////////////
7 i5 m1 y' m1 A+ O
5 C! _8 I. v. _& rC temp(5);// 实例化一个临时对象,
5 Y6 J& |( p. M$ [8 Pc = temp; // 用 = 赋值( J/ L9 x/ G6 `
temp.C::~C(); // temp 的析构函数被激活& ?# c1 o" V( C6 l* }' e
! D/ ]& m" ~3 k' `+ _3 M: Y. ?
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:9 o, a9 s+ M9 i! G. U+ Y

9 c+ \* ^! v5 n( Q/ N( _: ^class String {
, D% P  h" m" a) O  I- ]3 j' iint size;( Y8 z& f; v: d
char *p;) d! h! ?- O( R/ u; Y* ~9 c  [
//..0 s$ a$ z! d: B5 h5 V5 I- U
public:
; {0 }2 A+ H- K# ?  K7 u       String (int sz); //这里不希望进行隐式转换操作7 W' Y1 C; h1 X. k% P/ a
};" X6 y1 @  s9 U6 W# e$ {
void f ()$ Q4 c$ d+ u7 @; Y8 p
{
3 c( G$ ], G! U3 `1 h; L, j  o    String s(10);
6 O' ?- x' x% S, Z  R8 E, i& `: [
( M# s9 ~5 U& L- E% d0 P8 F" b    // 下面是一个程序员的编码;发生一个意想不到的转换:5 g9 w; o: n* j" F" ?' E# z

# v9 S; S1 R! ^    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
$ w5 m' v1 `  L' t# c- _}
$ E  P. R8 r( o/ e( i! q) I0 }* E# K4 _2 G; r, P3 q6 A
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:. S9 P, s6 q2 A- S2 \/ t  ]
- g6 ^" u( c% ]( V. b3 M3 ]
class String {
, J( {1 H$ f7 {# a! x0 ~( y; Y" nint size;
/ R4 e/ F' s. e6 l7 ~! i" G+ W! ?* }char *p;1 _' `" n- P( C* W0 ?; ~& s8 t
//..3 `( z4 f' {( @8 X6 R0 i" ], `3 L
public:/ o9 e9 H9 K7 V
       // 不要隐式转换
2 y+ W* h' W1 }, I: \. `       explicit String (int sz); 6 _+ K* x) V) l( ?8 c1 _9 t4 D, T, x
       String (const char *s, int size n = 0); // 隐式转换
8 h5 j  ]8 B: h5 b. K};
2 r. z' B7 s& g+ K2 V3 H+ u6 s4 k  g0 T2 `" t8 N
void f ()
3 R' @6 w& K5 S: X& l0 @{$ ^6 T" ^+ n* C- n, o" Y( R# w0 x
    String s(10);# D' N" W; t5 j9 x5 C

4 _7 O6 O  Z: M) c- a6 q; U6 w8 P    s = 100; // 现在编译时出错;需要显式转换:
6 s2 F' L5 C" B( \" @& n* c. B# P; w
    s = String(100); // 好;显式转换' q* C9 L& B" o4 V, G
    s = "st";        // 好;此时允许隐式转换
4 f% F! @2 u6 k2 B/ 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