数学建模社区-数学中国
标题:
[转帖]认识 C++ 中的 explicit 关键字
[打印本页]
作者:
xShandow
时间:
2004-12-31 08:54
标题:
[转帖]认识 C++ 中的 explicit 关键字
<
align=center><FONT color=#0033ff><B>认识 C++ 中的 explicit 关键字</B></FONT>
( {* g. A c( k9 p3 E
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
# G5 C) y8 o0 h' G W5 e8 }+ q
# R* R4 b5 p$ G0 v
class C {
! G! l5 I) Q6 J8 E n& ?6 Y; _
int i;
1 h2 s% \# f# r' Z4 O! m) M% F
//...
. a& M1 ^* I" c3 e
public:
4 I8 A) v3 [+ U7 ?' W
C(int i);//constructor and implicit conversion operator
" Q) m1 O, o* x- d$ N) I) y
//as well
; e1 f$ f+ Z, m! l" |
};
* F% E# t9 v8 R4 g/ b
2 y7 T F7 ?/ Q3 ]* Q( @
void f() {
@3 O. C; a5 L9 U" p; @. h
7 K8 X0 L5 P) p
C c(0);
5 K* }" x7 L* ~: Y) g
2 d" w5 t/ S+ T
c = 5; //将 5 隐式转换为 C 对象,然后赋值
: Y) e4 p0 Z& p/ h) h% f' B/ M* h
8 ]6 M9 I4 u0 B" X% X6 ?2 j
}
( i1 s N) [* I g6 c% ?
3 M, k" c/ o) u2 f1 ^/ V
编译器重新编辑上述例子代码,如下:
: {8 ^ P, @( N
& \0 F: `: A5 }! H* o
//////////////////////////////////////////////////////////////////////////////////////////
! d' S( o: v$ k9 `5 D+ K
//"c=5;" 被编译器转换成下面这个样子:
$ U1 T1 J! S1 \: g L8 C0 w* b
/////////////////////////////////////////////////////////////////////////////////////////
$ b e- l Q5 f" C$ f4 b7 _; M
, b4 x% W4 i+ p- `, Q N
C temp(5);// 实例化一个临时对象,
+ Q1 I0 s. N- y
c = temp; // 用 = 赋值
2 @6 t8 X3 T3 z0 w
temp.C::~C(); // temp 的析构函数被激活
$ ^! m6 U- i' ~8 t4 f
; W5 w2 F V z T
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
! s+ m7 F$ M- ^- A* F' N
- s5 Y7 K# D2 _$ r2 X* u1 B j' Z
class String {
6 P* x0 a, ~; ~$ K' \
int size;
( h4 M0 O1 l1 Q0 B
char *p;
0 a8 i; V7 F4 w$ o( f
//..
/ f/ P1 ]) `5 r8 ^0 B C6 |& \
public:
" S" ?' W; x" U! T; ~, H5 X" t$ [1 x' m
String (int sz); //这里不希望进行隐式转换操作
* d' f( P6 y8 S: S& s
};
& [( s6 Q1 w3 b+ |0 }0 i9 C
void f ()
6 e5 r+ i& \9 n) o
{
c* r# D; f; K1 V6 v* l
String s(10);
4 G& f6 ?' K# F; c, r% Y4 e# I, c
0 S, O3 \4 D+ d7 }, e
// 下面是一个程序员的编码;发生一个意想不到的转换:
% |8 \% k6 k/ X% L! y3 K# w
( O1 w% B# j+ s; V* b" P2 {/ K
s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
: J( G( t! \3 T$ {
}
& s( V7 J# P6 N6 U3 }+ S+ l
" Q" R- H2 j v7 k
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
/ c, d1 @8 L) v% O. f7 k# S
% e- N' j3 D1 e
class String {
4 Z8 V+ |0 P: l( u: b0 |
int size;
* W" f# P# [3 A. Y' g3 H$ ]
char *p;
e/ s8 V# i$ S
//..
# T2 R5 ^" l/ O$ \
public:
9 V+ f1 D8 I, T
// 不要隐式转换
( Z1 h) w) |6 F# \" ]$ h% {
explicit String (int sz);
. \, s/ P$ r/ V& h
String (const char *s, int size n = 0); // 隐式转换
! K4 m, N$ D2 ~8 Y' p6 W7 I: B& l! S D
};
( {7 x5 S7 t, `& }
3 { R |" d! \1 r9 I' }1 x; I; o* Y
void f ()
% b9 Y6 n$ X& `2 v) O0 n
{
# i: _" x \/ `7 e6 b2 b
String s(10);
; c" L H9 H. |7 B" i! U }. I/ N
6 A) Y2 @5 j3 I
s = 100; // 现在编译时出错;需要显式转换:
0 W" C1 K% Z, p T( I8 M) F& f+ q
# G C' t1 b( w4 R; T0 H
s = String(100); // 好;显式转换
0 C- |" s; T* v: Z
s = "st"; // 好;此时允许隐式转换
2 P& j) @( l3 w: j) m% D4 w% u( W
}
作者:
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