QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6099|回复: 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># w& o; N( p, y
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:- C- T" j$ k! F; j  q
) u! z6 G+ g, w1 x3 o7 c1 u/ t. Q- z
class C {
1 x0 o& E9 `, `int i;- ^0 z: r/ Z7 H7 O: t; i
//...  Y. G* n% N5 O6 i6 v
public:0 S. c3 ~# E" N3 [: @) L9 b1 {
      C(int i);//constructor and implicit conversion operator
! ~  Q: J; S+ p- _$ l//as well
* H* Y/ p- M  M};, R$ T7 N- n3 h' P6 }

# {3 f; r4 b8 n0 U+ i: C' Dvoid f() {+ I1 z( d5 \3 T- y" D& N4 @9 w
0 k* s7 M! k- n( F6 K' n
C c(0);) G9 b9 B: H- I! v, Q8 c2 {
( L7 u$ u$ @0 D: p2 R
c = 5; //将 5 隐式转换为 C 对象,然后赋值
. o' [) u$ q: P5 g' O) _7 f. g; F# L5 g$ @8 D- M
}
3 N& Q# U" q. U2 p: L, a& A* }5 Q) H6 S' Z+ h, N) K
编译器重新编辑上述例子代码,如下: # K: y* I9 ^! O4 n
* P  Z. O/ B5 F9 X
//////////////////////////////////////////////////////////////////////////////////////////5 e& H; r5 A  I8 f1 c7 @* Y
//"c=5;" 被编译器转换成下面这个样子:* m- S9 H* c; J! z% U; ]
/////////////////////////////////////////////////////////////////////////////////////////4 `$ Q0 I! y& \+ T5 b' h7 Z, l  ~

% W$ B* q  c7 W9 v/ q5 t2 c0 `5 dC temp(5);// 实例化一个临时对象,
1 q3 S7 O( `: u0 {0 w  R6 K4 d7 I- kc = temp; // 用 = 赋值
" d6 [) G! S( w4 M! X6 rtemp.C::~C(); // temp 的析构函数被激活
# L3 ]! o& a+ C8 o& M! W% Q- _1 F( \/ u) V
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
- W4 e1 ^5 b& V7 ]$ ^
# A% Q0 U% Y& ^! a% I5 }/ J% r4 T5 n$ \class String {
5 D4 e; B' k+ o9 gint size;
" d4 P9 Y: X6 u) q; m# o' }char *p;
- N8 G* z7 F6 g; n+ C- D" n//..
" e& u6 \& h9 O; _6 [+ Gpublic:+ }$ H/ j% q& i. a% _- V
       String (int sz); //这里不希望进行隐式转换操作
$ q3 i2 b! i2 Y& [' i! @3 P; P};
9 I, |  U- p3 B7 {, T7 X/ C( ovoid f ()
: }5 U2 b+ Y( f0 S) X$ f0 S; N0 y{
  f# B: u6 w3 b. I8 ]- m    String s(10);; [6 T& y2 a; q/ I4 {

3 U; b# i, ?8 j( v    // 下面是一个程序员的编码;发生一个意想不到的转换:
" z7 [6 v$ |8 [' M; W# t' W* _0 J/ ~) N+ R+ h0 F  c
    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
6 ^6 Y( O9 s% u) J}
% V: h# x; ?/ ~; q9 b8 O" h3 a. O/ |7 P; H4 B
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:% n6 q; L7 ?# }' Y  ?

1 a( Z4 x4 ~/ C! N; h1 `class String {) @( N2 U% [: ^1 m& U( ?3 f8 l; @; Y
int size;
$ r0 v% w5 |7 e+ s& Uchar *p;
' l7 y" r4 s4 q3 U. ]: C/ H; z) s//../ L  P8 f, k- e, C8 B# o
public:2 c9 i' u( l4 m7 L/ \6 E  w- \
       // 不要隐式转换
5 i% E( O/ b% y       explicit String (int sz);
( Q: f1 o7 }) w; i6 v6 `       String (const char *s, int size n = 0); // 隐式转换) h" ?; J- C  U+ V; n. Q4 K' K, e
};
/ D4 M/ o" _7 {. g0 ?
" u6 Q- o8 ^3 Q/ R. u( E" O% ]void f (); @  B' J6 y6 t& D! i0 t! m' C
{! ?% C4 T0 {8 T% g1 }! d
    String s(10);
+ d/ r5 u* O7 ^
# p( X8 ?7 c2 M8 j; {7 A5 b! a    s = 100; // 现在编译时出错;需要显式转换:' a4 n5 K4 k6 h; D5 x+ ^0 H6 T
; x6 F: b/ ^4 M
    s = String(100); // 好;显式转换1 c  ^# i7 f$ Z+ P4 e+ i
    s = "st";        // 好;此时允许隐式转换
( g, a' s" w$ |; m( u6 K}
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, 2025-8-7 02:54 , Processed in 0.645230 second(s), 84 queries .

回顶部