数学建模社区-数学中国
标题:
[转帖]认识 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 V
public:
5 w, ~8 |3 z2 S2 g
C(int i);//constructor and implicit conversion operator
( ]/ m0 Q9 s' N; y: j
//as well
0 j$ k- E2 X7 M$ n, U3 Q' U
};
) z3 G2 ?! C, c1 Y6 s( T
5 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 Y
9 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. _& r
C temp(5);// 实例化一个临时对象,
5 Y6 J& |( p. M$ [8 P
c = 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' i
int 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) I
0 }* 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" n
int 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 V
3 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