QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6368|回复: 5
打印 上一主题 下一主题

[转帖]认识 C++ 中的 explicit 关键字

[复制链接]
字体大小: 正常 放大
xShandow        

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-31 08:54 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
< align=center><FONT color=#0033ff><B>认识 C++ 中的 explicit 关键字</B></FONT>
: u, X4 [7 v7 A# p  }(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
3 ?& [1 ~3 G) u3 _. x
0 P# q! g8 E% O- |8 d" @% `class C {
3 Z/ `7 B. W% X; K" xint i;
$ v( F# d7 ]$ X" `6 P# e//.../ N( [. ?5 y# y; g
public:
) @/ [5 d0 O7 V) g1 \& s" @& V      C(int i);//constructor and implicit conversion operator6 V' m  B: i8 u/ f% n( M1 ?7 w4 L
//as well
, Y% d. \* t/ ~; J4 w0 ~7 e, C};8 }% _: W- N  L! L! d8 @  g9 n
6 U; ?' |& R! q& \
void f() {/ r8 c  J" W* q6 I' \; n' `6 @' _
3 L; j+ h7 s3 X5 z: K
C c(0);
, \# m6 q7 S% H5 L: a# z
" G( R# F0 f5 I0 a" kc = 5; //将 5 隐式转换为 C 对象,然后赋值
* F% N+ j* [" g- w2 o2 A& G* p% `6 R2 r% |- F8 I) V: i8 m
}4 y/ p6 D3 u" K8 d$ G5 ^, J
% b7 B6 k. p8 u
编译器重新编辑上述例子代码,如下:
# q4 L  N( w- A; b6 U6 ~/ b* ?. k" s; f$ L& g8 _! n
//////////////////////////////////////////////////////////////////////////////////////////
" J/ h3 \) n: i# ~//"c=5;" 被编译器转换成下面这个样子:
5 C/ j9 U, m/ L9 |# C+ K% L/////////////////////////////////////////////////////////////////////////////////////////1 l; S' I" \( W' x- Y# d! G& I; d. T

+ @! w. s/ J$ uC temp(5);// 实例化一个临时对象,5 z2 c. R9 f1 S! H
c = temp; // 用 = 赋值  H7 m, m" u- v* B) ?9 G7 i7 }
temp.C::~C(); // temp 的析构函数被激活
! V- f. B! E+ y( u/ w! ~" `& `8 G- a/ h# c  `- g
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
% [; n6 c! v  o1 ~% K+ A; z: H0 u" r- O
class String {3 @: k' s( U2 R; ^' X5 E  z6 c, j
int size;
$ X! W9 q4 Q/ O3 U, Z" Mchar *p;: i/ T! ?3 [3 N" M3 q1 Z0 V
//..8 o" Q& S; p" i7 Y* ^' k1 F% Z
public:
6 X( Y4 L4 C) y# b, N7 l       String (int sz); //这里不希望进行隐式转换操作
$ m2 X- t5 N" k) L4 [2 |2 I. g# q};0 J# A' ?- Q, \) _% K- V* p7 c- Q
void f ()
9 m8 K8 D! Z- b7 }# o5 g" i{3 i+ l( h8 L: S% f6 J8 k. i
    String s(10);
# V4 A" `: H% U
2 u2 Q$ E& K% M9 {8 g; `4 k+ n    // 下面是一个程序员的编码;发生一个意想不到的转换:
! w3 }4 t1 M2 G2 m2 W/ i$ X2 B& H- _* l7 Y& D( N. `
    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
  |* N; j& x1 T& l# [% u}
# Q# b& C% I' W4 M$ Y1 @" ~
0 E+ `2 I; r9 u( z& ^- ~. L为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:# A( O  n9 z( I( l1 Y
$ s0 @0 m: a0 m! g  n% ^% i
class String {3 w5 F8 V" ]4 T' `" M5 v5 e& o/ A
int size;/ t9 R3 n; z6 O6 A# N# [
char *p;- |" x) ?0 T" M
//..& U" |- m! J6 i* x/ w/ z
public:
4 c( P7 b, Z3 d% o, x, e. b: s       // 不要隐式转换7 I) O7 A  x9 s7 r1 e
       explicit String (int sz);
/ Q; z  C% E/ p2 q1 y       String (const char *s, int size n = 0); // 隐式转换/ F7 s0 I7 @2 M2 g
};
  w. G4 ]2 Z8 l/ H4 A& D- o  n4 H2 l4 @
void f ()
7 k8 g  A3 q2 J- M{4 Y4 I: k2 ]0 {
    String s(10);
  ~) |) V- e0 f* I, A8 G" M8 _  ?- g
    s = 100; // 现在编译时出错;需要显式转换:
( v1 W; x; |& J0 p2 u9 W) S2 H; ?5 s
3 `( d" x3 d$ h, d; a2 I9 s# A: E; W    s = String(100); // 好;显式转换4 Y$ U8 h: P: \0 J4 D% x
    s = "st";        // 好;此时允许隐式转换" d! y& m3 x4 c* C
}
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
jiner        

1

主题

2

听众

20

积分

升级  15.79%

该用户从未签到

新人进步奖

回复

使用道具 举报

csenml666        

1

主题

0

听众

19

积分

升级  14.74%

该用户从未签到

新人进步奖

回复

使用道具 举报

txj66        

2

主题

2

听众

42

积分

升级  38.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

husir1983        

0

主题

0

听众

12

积分

升级  7.37%

该用户从未签到

新人进步奖

回复

使用道具 举报

sabbanji        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-3 12:18 , Processed in 0.485344 second(s), 85 queries .

回顶部