QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6373|回复: 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>9 }3 @; |' V9 r' @
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:4 z& y4 S) G+ }; \) d5 N
3 m1 E4 A; f$ m" Z. G. \
class C {
5 }( F- Q9 `% P! Tint i;
" F4 b: F2 Q$ b/ o% M. a' h//...
: S* P6 z2 @% w  Qpublic:& V& F7 u9 X2 P+ T, s
      C(int i);//constructor and implicit conversion operator0 u! y$ S/ w7 C) t+ G# l/ K5 t
//as well- j6 F) |" C3 K; m) ~
};
" z$ E1 N+ v8 t1 ]. ~5 s" d
; }& t: t) G3 j8 R! T- ~! @void f() {
2 e- {) }+ U+ t, z# X4 H& s( `
C c(0);: O/ M4 y, C7 a& h& C, _

2 \  a5 G4 a6 H" X. Vc = 5; //将 5 隐式转换为 C 对象,然后赋值4 a8 P# m) E6 h8 J
# D7 o6 k9 w* v' M( Z0 l( |
}- X- n6 V- O. f$ s

2 e0 e3 ^" Y( {% E  r编译器重新编辑上述例子代码,如下:
% a3 j, D* F) S4 m/ C- Y9 t
! N4 K1 w! b4 `5 ]  Z//////////////////////////////////////////////////////////////////////////////////////////
# W: B3 M/ \4 y( B1 e7 x: {//"c=5;" 被编译器转换成下面这个样子:  E" {7 ]8 O0 n% t7 O% E. `
/////////////////////////////////////////////////////////////////////////////////////////
7 C  R" v% A  T' z+ g
- U5 b. t% [! @! h% }C temp(5);// 实例化一个临时对象,
% \8 N' a0 n4 _0 _1 X3 s2 x! m) oc = temp; // 用 = 赋值
4 ]. I3 ]% s, P- M9 stemp.C::~C(); // temp 的析构函数被激活- X+ s$ n% p- j# Y+ \' p

, l. r0 q( g; U0 L" `在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:* j" Q- c7 i; x& @% D
1 X8 @, }) @* ~
class String {$ x; X  r6 F6 c( T- j1 a
int size;
; N$ d$ t0 I! ?! r7 O' Nchar *p;$ Z+ ^3 T8 b  X9 i- S
//..4 l8 k1 n4 E' S% ?" k
public:
6 o$ \$ r2 n9 a% b( J4 `$ R8 J, r       String (int sz); //这里不希望进行隐式转换操作
; i# \+ [1 {) S7 U# w% i8 E};
& b* S* h' r# U5 Yvoid f ()# q# b, [$ E9 U6 P& n* c2 M; Q" a
{+ O0 V% R: W( E( m0 d/ F! g* r
    String s(10);7 R0 C" |0 e* s  {# B3 |: D

% Z9 a$ W. V7 \" B- |. W    // 下面是一个程序员的编码;发生一个意想不到的转换:( ?5 @6 P* P. \, i; g6 l$ H' j
6 _3 h; Y: S9 R# ~7 O5 P0 e
    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
( L. X" P* x6 _3 J+ K} ( l2 B' M, a, |7 Z* K

3 h; p, F% E# o为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:- Z# u4 K$ i+ ]. t# Y  ]% [
4 o# r6 X; Q. P2 m
class String {
% S3 F1 e5 t9 ~int size;5 w# Q/ }. \9 p; w. H
char *p;3 c7 X# h+ O2 c  G' H& L" u
//..) q) N8 F8 z9 J6 C
public:9 K& ]# V% ?/ j
       // 不要隐式转换
" X( Y( o5 n0 I; n' o4 J       explicit String (int sz);
" v/ `# ~& t. t/ L7 M( ^0 `& D# j; @       String (const char *s, int size n = 0); // 隐式转换+ N, T: I+ t$ n; }, Y( J
};/ U# x4 O: e  i; i, u3 O

7 B/ n$ e$ e8 ^7 {. T* yvoid f ()
# H# K. F4 Q$ v! u6 U5 b0 ]{- U0 ]: g1 B! g
    String s(10);
5 p$ `' T8 J0 E5 h- Y
* m4 d* f0 h& q( l3 X" k+ ^5 _    s = 100; // 现在编译时出错;需要显式转换:" t9 O/ h  g6 T; a& i' ?

- Y2 ^4 w7 p& p1 g: ]    s = String(100); // 好;显式转换" d. R% O" P* f" [+ J& b
    s = "st";        // 好;此时允许隐式转换5 K% j( g' m1 L- {7 y) ~- M) h
}
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 14:39 , Processed in 0.450387 second(s), 84 queries .

回顶部