数学建模社区-数学中国
标题:
[转帖]认识 C++ 中的 explicit 关键字
[打印本页]
作者:
xShandow
时间:
2004-12-31 08:54
标题:
[转帖]认识 C++ 中的 explicit 关键字
<
align=center><FONT color=#0033ff><B>认识 C++ 中的 explicit 关键字</B></FONT>
. K$ |3 i3 N8 Z- n! P
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
& v. J; O* n% L' Z- s3 z, D1 m
& v7 } k& y$ u1 `3 D# z
class C {
U* T* |) i7 y2 c( G/ B2 Z* m& P
int i;
2 F k1 _ X& E- O) r7 B2 e
//...
! E. ?/ u/ N5 Z/ u, g1 ]! W
public:
/ l* h, p, Y( n3 H
C(int i);//constructor and implicit conversion operator
9 r5 w' L. |! m, P6 n" S
//as well
0 H2 F( `0 b& H% D
};
: u: e$ g E' Q, \& _( R, U
}$ y- H" {- U# G# J4 D
void f() {
+ e; S+ n+ _) q+ G8 t
: ?" h4 b3 g5 ?$ L& U+ \
C c(0);
' a* o1 u$ p! J% `
% s& e+ O' A* T6 z5 n
c = 5; //将 5 隐式转换为 C 对象,然后赋值
0 `3 ]7 K& b6 x0 @. W% [2 V
! r k7 {& l7 Y$ R
}
' Q" \: ~$ _4 d
5 L# L5 Y2 B5 A( l; z
编译器重新编辑上述例子代码,如下:
) `# h# g! \5 C) F
) s: `. K" k( Y
//////////////////////////////////////////////////////////////////////////////////////////
" Z& b- y- U1 n" J; y
//"c=5;" 被编译器转换成下面这个样子:
8 g" C# G# c. j) n! H- \ @
/////////////////////////////////////////////////////////////////////////////////////////
7 O' L" ]4 F( w+ |9 S# J" f
( w m' e0 ^, ?! F2 X/ d
C temp(5);// 实例化一个临时对象,
. ]. [ i$ H; g1 [0 N
c = temp; // 用 = 赋值
. G; a9 U4 [) g% T- |1 v
temp.C::~C(); // temp 的析构函数被激活
- ~9 V% |# i$ u& p. F$ y, Q
; v+ ]9 Y; Z f& K/ }9 i
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
; O( Y6 D" E# r1 w, c7 E7 z" [$ {
1 w* e# o) t5 @. |8 E& [$ \1 p* W
class String {
5 j1 q) T( H5 Q: m5 D0 i4 t" ~
int size;
! B* }9 u W; m. j4 t% N
char *p;
$ `2 K9 U4 _6 S" e
//..
l x7 J/ f& p, G, `$ O+ j* y! W
public:
0 ~( p! t2 T7 F
String (int sz); //这里不希望进行隐式转换操作
+ @9 h. }! `: r0 N
};
- T1 {9 G" t3 G2 L% _
void f ()
& A( B+ a8 s+ u3 e1 d! \) m+ s
{
) f3 c( J9 _9 D5 W, k/ N7 {! z
String s(10);
" W0 l: h& a- h$ L/ u0 G
, o& s& w* V" i# h& O4 f) s. N
// 下面是一个程序员的编码;发生一个意想不到的转换:
; q; t. |2 s7 w5 E5 K7 F; s' a2 d
/ \6 \1 G, Y4 l' u G( _( Y
s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
6 @4 t! E1 g# G' C9 B% k4 [
}
9 R5 z( m* w6 w* H) E, N9 \1 S
* r# E0 t v' t8 ~( v) r# T
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
0 |" b4 D7 |2 \+ L
- B: b' R* D& P! i1 `( p: O W
class String {
7 ^7 }% ^5 U, K' \, D/ q
int size;
( L; ^' j; p; N
char *p;
s& u! v* y0 s
//..
. W+ h% y3 M! O
public:
6 p+ W5 k1 y( X2 }8 o, W2 U, N- I4 }
// 不要隐式转换
2 L$ {6 h$ I, r( v
explicit String (int sz);
6 {5 O3 A7 s0 K" S2 r1 p1 G8 m _& ?
String (const char *s, int size n = 0); // 隐式转换
4 I, T8 w- J$ F2 X* B
};
6 F; e& ]+ U1 @& ~, e/ ^
# [4 i+ @& ^6 t: T8 {$ I
void f ()
# i4 K; [2 j2 A
{
1 ~% ?; {% W0 E0 _5 H' K
String s(10);
% j$ Q+ O1 f) x M, @
3 K& f; j# I6 g- ~
s = 100; // 现在编译时出错;需要显式转换:
/ h- K' l& ]8 t& o1 u% h
$ i0 y+ U. D, u. }$ T+ v1 _
s = String(100); // 好;显式转换
L( p- J) ]" V+ W+ h
s = "st"; // 好;此时允许隐式转换
* ?2 Z$ O/ @# n k5 Z# W& a
}
作者:
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