数学建模社区-数学中国
标题:
[转帖]认识 C++ 中的 explicit 关键字
[打印本页]
作者:
xShandow
时间:
2004-12-31 08:54
标题:
[转帖]认识 C++ 中的 explicit 关键字
<
align=center><FONT color=#0033ff><B>认识 C++ 中的 explicit 关键字</B></FONT>
! `+ e( t% l2 g" g% U( ]
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
1 ^% H6 g7 Q' c: o N2 E
% Q5 v5 i/ L4 b6 i/ C% ?3 a: M3 k
class C {
+ F9 e O E/ M4 k W; m1 x! G, t* z
int i;
, m, }, R: i8 a; W
//...
" Q- u* ? i6 Z2 b9 O { T
public:
8 ^' _0 b6 Q; q' ]; o
C(int i);//constructor and implicit conversion operator
" e$ y, p, [3 Y m8 g
//as well
X$ I6 k O, u/ [
};
, a: ?* I4 {: M# E+ e, F
/ I' U. C3 B0 J0 E0 N" k! ?5 s
void f() {
9 T$ @1 n! l5 u2 y5 R0 F/ H
: Y5 U4 k7 ]6 i" W9 ]
C c(0);
: F8 }# \/ A* J
. i# K+ f1 \$ j1 `. {7 n- u
c = 5; //将 5 隐式转换为 C 对象,然后赋值
: d" Y. k, C& f8 X9 i0 Z; ]
0 c) f6 f# C& A' M2 [; u
}
" W/ H5 l$ H1 ?' Q; ?% w0 ]
. O' \5 |- o6 Q# C
编译器重新编辑上述例子代码,如下:
1 V2 Z# k6 E) @& z' Z: S, i
0 L$ @* I7 e x- @" \
//////////////////////////////////////////////////////////////////////////////////////////
1 k8 A1 ?# o' v
//"c=5;" 被编译器转换成下面这个样子:
: z1 p1 {" @- o
/////////////////////////////////////////////////////////////////////////////////////////
1 p- S# b( V+ g) \2 v$ F1 F
4 Z1 k. M5 {5 y
C temp(5);// 实例化一个临时对象,
0 I) n9 ^) J0 W+ @# g8 N
c = temp; // 用 = 赋值
" [6 d M# M3 L, A+ `; t# c9 x" O
temp.C::~C(); // temp 的析构函数被激活
+ K4 G" x- Z$ N# U( O
* O( Q+ F* ~: j
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
- v3 e4 n3 F, U
* G2 O8 j6 @: b. x
class String {
' n: }3 }- t( L6 M4 K
int size;
2 J8 r2 C6 _7 X' L4 G1 W' t
char *p;
; w" O7 f" d5 a2 V, n& E
//..
' j" R. E$ c+ A7 Y
public:
( P, V3 \2 D2 ?) ]" N! R4 v. z0 F& \
String (int sz); //这里不希望进行隐式转换操作
: W6 {' r3 y. U4 k( p
};
3 a. |0 z' W2 {9 J* m- }
void f ()
" L7 z3 {) ?! l1 `/ o; d1 v
{
" w( N9 U( E" w+ R9 r: _- Y$ [" G$ W. W
String s(10);
, B% _" j, ~0 N3 h
2 K/ @$ C& N$ y+ z* b: U
// 下面是一个程序员的编码;发生一个意想不到的转换:
7 A9 o, i: g" K( L. ]1 ]
& l; W; n c- H) [7 ]
s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
: Y# [, R7 Z" s0 t4 h L( N" \
}
5 Z- b( w1 X! K
4 `- _1 E4 M' }
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
# d/ z: I1 v& ^$ S6 A4 ^: S: n
: Y/ W4 ~ S, E: u' y
class String {
& |6 b; f, L3 {& k& ~* v5 O
int size;
3 p, R/ e& a; D) \6 g7 Y
char *p;
' Q' A* i3 b/ O6 H. }) D0 _
//..
# T K7 ~6 C4 V G3 I
public:
& N1 ]9 H. K, ~ I* J5 }
// 不要隐式转换
* q3 y# v- j9 O$ Z* A/ \
explicit String (int sz);
: V( x1 m: ~9 C, L" b5 b" Y, S
String (const char *s, int size n = 0); // 隐式转换
# P8 c) K0 l; I. b5 H8 Z( F. O
};
; h% e- e9 |% c1 }
+ d# Q; O5 c% ]* }2 ]3 V' d' L
void f ()
" b( `1 d+ V- }- ]' _3 q
{
4 E+ k7 ?3 {8 c; Y
String s(10);
1 C8 U8 H, G- n' H' L
) u$ I y% d& ?% p. _5 }
s = 100; // 现在编译时出错;需要显式转换:
1 n! p* M _& o1 Z+ I3 h# k
: M- I, N! E9 |: A- \( ]3 u4 u
s = String(100); // 好;显式转换
: u2 V p( V* @, W
s = "st"; // 好;此时允许隐式转换
" [$ E5 b; Z5 h: i9 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