数学建模社区-数学中国

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

作者: xShandow    时间: 2004-12-31 08:54
标题: [转帖]认识 C++ 中的 explicit 关键字
< align=center><FONT color=#0033ff><B>认识 C++ 中的 explicit 关键字</B></FONT>- v0 }  Z& O" J) z7 S
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:( g" v& I  I$ ?  z( q' v6 G
: k& W* v' _9 ]) l5 q( e( |* D/ V# ^
class C {$ W' A7 [7 E# F( b/ t, y( c
int i;- Z, m* t; N) _2 j' d( _
//...
" ^; x6 q9 E" q: ipublic:7 J9 o$ E" w# P0 i% i7 j
      C(int i);//constructor and implicit conversion operator4 ?" o1 a" k% M! V- c
//as well
0 A. f, M4 g8 D& k  r; X$ _2 j};
% D# k& W* F' n/ @6 R4 \1 S( U/ K
  W* ], g) k1 R' Zvoid f() {; |2 l7 z: `( |# Y" I& x
! [( U/ j) [( d+ @3 n# G, w
C c(0);# \) K, V$ x. J6 S9 F+ \
3 x9 t3 A3 g/ X7 I( @, `
c = 5; //将 5 隐式转换为 C 对象,然后赋值2 L+ i$ y  J) s2 V9 g# y; P3 k! @

" e/ m8 @' y( V" U}) {, A& M6 C! R3 W
! v, v$ Z( w0 A% f! w& N' S5 m
编译器重新编辑上述例子代码,如下:
1 T, @2 X7 X$ p% Z# q
  J0 E" h. F# C0 r//////////////////////////////////////////////////////////////////////////////////////////
6 S0 I' j1 @2 t' o) n# R4 A+ J! ~  m//"c=5;" 被编译器转换成下面这个样子:
3 c# {6 |9 _9 y/////////////////////////////////////////////////////////////////////////////////////////
2 y: E1 [( T( V0 p  ], H$ |
/ Y6 g2 U" S: A" ~C temp(5);// 实例化一个临时对象,
0 h7 J! V- e' ~# Oc = temp; // 用 = 赋值
! w/ W0 |9 S) w: ~temp.C::~C(); // temp 的析构函数被激活  t& p9 ]* O' J# c* V2 `

" c5 [2 z$ }! g" q0 c/ R6 e在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:/ T5 K6 a/ x. o
0 @# f7 Q2 i0 \
class String {* D' y6 ?9 f3 W, d! U
int size;
1 E, h8 h/ n/ v- ~char *p;: S8 H# P$ P" W2 i4 ]
//..
, z  L( w$ j/ Z5 `) J! t. [public:
3 ?, ~8 W; Z' j! Y       String (int sz); //这里不希望进行隐式转换操作
; a; m2 O+ U, c4 d. b5 v( t6 ~};( y8 e; v( V0 C: r  v
void f ()1 F, }6 G) D4 S7 ?4 R: m$ P( J" a/ `
{( \* O: @( R: B; h9 p: f
    String s(10);
7 z& v) r# w# c1 v, v& c. Y
) L* G6 `. N- h+ D    // 下面是一个程序员的编码;发生一个意想不到的转换:
0 ~. K8 l$ s4 R: {* y: ]2 t0 y/ m9 U! e0 t! S- h# ]. v: p
    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
0 f/ y) v  Y# n3 C4 v/ ~% X}   U  C3 O# D7 k2 F$ Q+ o- z3 a
2 q$ U7 ]( C6 L
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
3 V) }9 `( [6 ?8 T; j+ D
- `3 w- z; E1 O& `, d  t# i7 Gclass String {
" R- ^( ~, z! |$ {0 b/ S) l# Lint size;
: N* ]" C, z, N7 T  k- p9 Qchar *p;3 a8 B" M+ a8 V! Q# N! O
//..1 x2 L# n, }$ j0 z
public:6 v7 c! [0 B7 E
       // 不要隐式转换$ z% j8 [1 d3 Z: I
       explicit String (int sz); ( l# x1 h) N- G! I. o7 |+ `: h) M
       String (const char *s, int size n = 0); // 隐式转换( Q3 Z6 s9 x& Y: A8 ^9 Y
};1 _. S* j5 a1 x1 E

' T' P6 r) ]# l# L4 }8 Rvoid f ()
& G1 {. R$ z& q/ W  b{" p+ I6 G6 L( P! h8 R
    String s(10);% ^+ u; e" N. ~+ {( _

4 N. ~! M1 J0 O* u) F, B7 f9 a    s = 100; // 现在编译时出错;需要显式转换:0 m% L0 J) C) [; i8 U
, p4 f+ U% O$ J3 r! L
    s = String(100); // 好;显式转换) I$ V' E: B) W. q
    s = "st";        // 好;此时允许隐式转换
* n; O9 m/ Y* k& l9 e" ]}
作者: 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