QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6339|回复: 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>
# ~6 o. c$ E9 q/ G(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:3 _/ n# ]/ g; E$ E. x" u: g
+ g4 |& k2 ^) ?# {
class C {
" K- i$ y$ R( Mint i;; g; ?& f, M, M# {: M) n4 K- n2 ]
//...3 V4 b  C4 f  N8 o& n, W# b5 ^, f
public:
) d" a5 R# p$ c# y% @# g      C(int i);//constructor and implicit conversion operator
$ h1 K6 w  }! \+ J0 ~% ^//as well
! e3 ^+ D& z; `. Z: @7 ~};
1 F, g- t& d/ W9 r: s5 p% R0 A0 i* l8 m& E' G# y
void f() {9 [3 C6 ^8 p' S3 C% w

! H5 C' T+ y1 G4 q1 o8 Y  {C c(0);' |7 J' ]7 b* \  w+ ~
! L1 m) Y2 b. f, q
c = 5; //将 5 隐式转换为 C 对象,然后赋值% X% a% T2 w( N

, X4 q: I0 t5 t" o}
' ^/ [' h4 w& ^: [0 ^7 o/ ~
- X$ Q! J* K2 _  I3 E" y编译器重新编辑上述例子代码,如下:
- S! F2 Z; [8 Q' h, ]7 s* h8 C
( M7 Z: ~7 |" w) X( v( o//////////////////////////////////////////////////////////////////////////////////////////
: q/ y$ b' p8 G9 ?" \& T# |//"c=5;" 被编译器转换成下面这个样子:
2 e0 h2 I+ B, K+ D# o, H/////////////////////////////////////////////////////////////////////////////////////////
  H! H2 A9 A% |5 E& N; M5 k) c- s# T1 i3 x5 N; ?! b* T5 p
C temp(5);// 实例化一个临时对象,3 {9 q" d& z2 }
c = temp; // 用 = 赋值- i4 [8 p# i  l# H; r; T6 A
temp.C::~C(); // temp 的析构函数被激活) W" S7 Y* c1 m! U& k6 A
' F3 E$ {0 D9 K* ]! k5 j
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
& \* h7 k8 A9 U- |' e. v/ q
$ q( z! s- s! p( Qclass String {  L" p. A. B# A/ A- `0 _4 T$ Y
int size;, R; f( y3 Q6 ?. h5 W" J- r
char *p;  G4 |2 b' A2 ]6 w
//..7 R. O3 Y0 O5 A1 n9 v# z" |! I4 O* j
public:
) W* f: ^0 }8 ]$ t  p: V: V       String (int sz); //这里不希望进行隐式转换操作
7 V: G2 P( L; {8 @( _};
# y: i, h" M2 {" `& i* Y+ s2 zvoid f ()
) d* l4 {- X+ J4 |: p/ |+ I0 r2 P- e{; @  Z4 w# }9 h' I# e3 m
    String s(10);. ^9 l; u, f" F9 j# b

4 m4 H8 I2 N+ v6 t    // 下面是一个程序员的编码;发生一个意想不到的转换:& L3 C  B1 e2 T# B* {

. i, m2 M9 m$ S    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
, _' K, O0 Q/ ^+ K}
& Q' k% o) q: F4 D5 r, [1 n. i
  W8 P& g3 W' {9 y9 {5 I为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:2 z' x; D# @6 {1 b* ?
/ v# V0 V# ~' K
class String {
$ k9 t& R: _7 L8 @0 k5 B' Gint size;# h' b2 y7 ?9 t
char *p;
0 v) g6 W0 ]4 }$ m1 H$ U" u1 f//..0 _2 S( W# e! v: r& I5 [
public:8 [, v  k1 i  C+ ^
       // 不要隐式转换
! n7 z! t6 Q7 h! _! U       explicit String (int sz);
! n% [# b" x& h9 w, F# [% }       String (const char *s, int size n = 0); // 隐式转换
7 _3 c" [; i& o};
" h0 F/ H( `* F6 |
) t0 V2 H( Y& r4 Z3 Avoid f ()
2 w  P& w' G4 w( x2 x{9 d- P' l6 b5 u- X3 O
    String s(10);
, r% P4 Y, r3 V$ r* y
* Y& ^$ g) }$ [6 H) ^, J. N9 \    s = 100; // 现在编译时出错;需要显式转换:5 d% i9 _$ M' m8 |( U# I- _. F

" J& E9 i; \( z% x4 ?    s = String(100); // 好;显式转换2 n" [3 J5 Z, X. V9 H
    s = "st";        // 好;此时允许隐式转换
; r1 r$ C, ~0 i! ^( f}
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-4-17 18:59 , Processed in 0.723112 second(s), 85 queries .

回顶部