QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6426|回复: 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>
; v) d4 ~3 R) u6 g7 _(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:# ?  Y: M0 P0 ]' N
) ^+ Y( d/ V! `6 c7 k; f
class C {. i. t9 X# t" s3 q) ^
int i;) y- h" V8 b# ^4 }
//...
# d7 e, p  U5 D" l# H% Ppublic:
) K; J! g+ z2 c5 z! p      C(int i);//constructor and implicit conversion operator  p: R! ]2 S% `1 L
//as well6 D" E2 H+ \4 N7 o: i6 ^
};
# l" ^/ _3 A1 _/ o4 Z. Y) l: m& E6 Q5 a5 d. v- Z
void f() {
- ~% j/ C% R& q; x; R( p+ Q0 h* R  C5 N0 [1 V; S4 d
C c(0);
+ \- M" d/ x4 K. p' `* s4 D% y$ F
+ K( u- W5 a% \7 b: `' Pc = 5; //将 5 隐式转换为 C 对象,然后赋值
- L8 G. m$ D* D) d/ Y) M5 X' ^) G! l$ {7 q# P1 k/ q* h4 L
}
; ?3 H4 S  U) w$ t  ^! K/ \
/ Y- N  h1 Q# }) g; i编译器重新编辑上述例子代码,如下:
1 z/ g7 m" W; [, x: s, r% u' m! b4 D* a# w' W2 z
//////////////////////////////////////////////////////////////////////////////////////////
  J0 z: f4 h6 Q, V; [//"c=5;" 被编译器转换成下面这个样子:
- r0 S/ B0 C+ f/////////////////////////////////////////////////////////////////////////////////////////
* n- u9 x, U) D) ]1 j* o9 u! M$ y9 |3 N- _
C temp(5);// 实例化一个临时对象,0 y  Y! p- u6 N1 y; b
c = temp; // 用 = 赋值3 k! N; I6 X: R
temp.C::~C(); // temp 的析构函数被激活
" l7 l# V1 `& o. |$ b
/ T* n( j- l$ S$ M$ e在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:5 _; g8 R2 M: p

2 g* F5 Y1 }3 R1 p2 K! |) F5 ^class String {
, ^& G. Y8 B/ y7 v, cint size;
% ~, {' \# p% a  H: cchar *p;# o! c: O1 y! ?- b2 i; C
//../ r5 g6 p: p4 O2 y5 R4 }  t! Y- |
public:
$ m/ u2 g: ]3 B: J& D       String (int sz); //这里不希望进行隐式转换操作: @# v, `/ T' ~( E: x
};" y( {+ T0 K* d! }8 O
void f ()
8 G  v* b$ ~1 w{
; l. j% I& c, q! q( E% h6 R, j) e; o8 i) e    String s(10);7 V; }- T$ K, b$ ^, q) z' ~

9 C' Q7 r  N) w7 ?" y( ~, I    // 下面是一个程序员的编码;发生一个意想不到的转换:( B1 j: {& O# B- X+ f! {  i5 a1 g
2 b1 {$ Y2 j- A/ ^
    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
8 T! K  f+ d3 X) D7 W8 N} & {& ^: G; g+ v7 R: r3 J+ ~2 E6 ]- z' _

5 t/ h. T1 J' f, c2 Q为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:4 Z7 ^  q* t; t( V1 |

! c( H9 I7 B) Mclass String {
# v: Y" h; u4 N, u2 x( [2 k( jint size;6 ?" _) @0 U* N" d" O( o0 a, X
char *p;
% ^1 w$ z: [* E( f# F//..9 p3 f7 w- ]* E
public:
' P  y/ P# w1 u. n- s       // 不要隐式转换
0 a) u! \  L( T$ N5 B       explicit String (int sz);
& s1 n0 c' L/ B8 j       String (const char *s, int size n = 0); // 隐式转换
& P5 l, T" S2 Q, i/ I6 [" Y1 Z};- k% g4 L0 v9 {0 w
6 D6 K  l7 T+ C. d+ L
void f ()
: }8 a/ T! l- ^{
; c3 ]7 I$ S" W1 C' }# ]    String s(10);
0 }+ t! }9 y8 c1 d
3 F5 o# N' H& K    s = 100; // 现在编译时出错;需要显式转换:
1 s# f" @- J9 @7 K6 ^8 G( T) Y) O; z
    s = String(100); // 好;显式转换  P- r) z  a* H2 t- Q
    s = "st";        // 好;此时允许隐式转换
! ^* [* u/ `0 Y) v. E: L}
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-9-3 07:48 , Processed in 0.316116 second(s), 85 queries .

回顶部