数学建模社区-数学中国

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

作者: xShandow    时间: 2004-12-31 08:54
标题: [转帖]认识 C++ 中的 explicit 关键字
< align=center><FONT color=#0033ff><B>认识 C++ 中的 explicit 关键字</B></FONT>
3 w8 C/ e3 \" q# `  N/ a5 W- q(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
. l& K6 J9 `% d4 e5 w* `5 {) ^
+ ^* s+ [! N6 \4 O8 r6 Z  [0 Rclass C {" x6 v/ R( @" {) S( Z9 R1 O# l
int i;& e3 a& Z3 f8 q) d' e; c( X1 k6 p
//...) u* \  ~" K/ x: S9 X* W, f# Y
public:: ]( L7 [8 N$ i3 `$ f: j( _- K* D0 h
      C(int i);//constructor and implicit conversion operator8 D; E2 q8 |5 ?4 z) p2 k% w
//as well; V# M. O$ h* S" P* y1 N4 j
};
. F5 x/ G! C8 j! P% J7 ?
; A. h. b- v& K: A' _& n7 D* nvoid f() {
. j" _- p# [% \3 V7 B6 I' Z4 D, ?2 p- G2 r/ B* X# K
C c(0);' z, q, C' j$ p  ~$ N
# d1 }8 _; ]+ V; k. p
c = 5; //将 5 隐式转换为 C 对象,然后赋值7 R! M/ O+ P4 L1 m

+ W2 \3 j0 \: U5 M1 R  ^}) D& }# o; D+ K- B1 S% T

$ z! a9 z; |( T2 ~编译器重新编辑上述例子代码,如下: 5 a3 `9 K* ?6 ]
1 u3 j8 Y7 k- e( @, D% C# f8 G
//////////////////////////////////////////////////////////////////////////////////////////
, Q* O3 G: S) D2 f7 R//"c=5;" 被编译器转换成下面这个样子:
% p9 e8 C% O) d& q; u, b/////////////////////////////////////////////////////////////////////////////////////////5 ~5 q7 A  f6 g* [0 |8 C, w7 S4 r
+ e' B. j" k1 ^3 x2 y8 m9 I, a
C temp(5);// 实例化一个临时对象,! D) c6 }4 }8 f( I$ H
c = temp; // 用 = 赋值
/ e6 g: V, x4 i; a$ l- F8 {7 {  Utemp.C::~C(); // temp 的析构函数被激活
& g7 [9 h9 v& r3 ^& x; Z7 q, Y7 j! _
/ p+ I& D& ]/ V0 b在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
4 w' D2 N  \3 W' g% g  `; ?* x# Q
/ w1 M# n/ L1 V0 D% M) B0 `3 G' n& ^/ Rclass String {" B, f! d% z0 v! a6 i
int size;6 ]' Z: _( M1 j4 W' O3 Y# P
char *p;" D/ u- C! e  e* A! g. n! K
//..' e8 a1 L3 U& v+ N  s6 N, B/ |9 J2 ?: J
public:8 H6 X5 n  }% Y$ B3 v4 O. F) @
       String (int sz); //这里不希望进行隐式转换操作- v5 W' v% ~2 z+ x" }2 E" ~7 g# o
};
9 F, o6 S% X; rvoid f ()0 J  z  P- i, }- ?& w
{
5 M( q: A* S' I3 i5 S" F) r1 |    String s(10);, E, n. s8 O2 o4 |/ w

2 q" M# v- S1 R6 Y4 z6 u    // 下面是一个程序员的编码;发生一个意想不到的转换:
& d! u- x6 c9 V7 e% d1 x5 I
) Q  F0 p5 p7 p6 Q$ k/ F% M3 |' n    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s; a  d- |) x- l  Z
} 9 |1 p" P: O: w( h  d/ s' m/ f
% k3 B( h6 Z( M) J# V
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
7 ?. I; b" z. X# W0 }6 F
2 B+ @! K* {* Lclass String {7 \. C" r0 U. U/ V. v6 M
int size;
; x, m1 y  F4 _) [! w+ @9 Z' h% Rchar *p;& m: ^% x5 m( N. t: \
//.., ^" U% k+ w' l$ \: i6 z
public:% J) O  _: |5 S7 Y" w2 r( d8 q
       // 不要隐式转换
* {* p, P$ F9 P7 V# X/ n/ `       explicit String (int sz); ' m% v: [% c5 O; Z3 U- v% x! ~* U
       String (const char *s, int size n = 0); // 隐式转换* f* d% y& B! e/ ^* ~* t( p
};" J2 e/ m9 b' Y/ v7 B5 y

" |' Q2 [, F* W( \void f ()1 v+ Q* H4 I+ y& n7 l0 x. Q
{
0 k) i2 J( ?* w( L    String s(10);
6 Z0 J# t3 X8 Q( ]# i( q! j3 B, \! d; N8 }! O+ |# l# G; N: b
    s = 100; // 现在编译时出错;需要显式转换:
7 J) i( c* K& h( S0 ]
# U) c5 `8 H* W" n    s = String(100); // 好;显式转换
/ ?# i7 C9 F9 e. r- e    s = "st";        // 好;此时允许隐式转换5 i! z8 o+ f  p0 K
}
作者: 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