数学建模社区-数学中国
标题:
[转帖]认识 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: i
public:
7 J9 o$ E" w# P0 i% i7 j
C(int i);//constructor and implicit conversion operator
4 ?" 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' Z
void 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' ~# O
c = 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 G
class String {
" R- ^( ~, z! |$ {0 b/ S) l# L
int size;
: N* ]" C, z, N7 T k- p9 Q
char *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 R
void 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