QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6425|回复: 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>
$ K0 J+ w: C. J  j) ?(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
( ]$ N1 Q# Q$ h2 n, b" P; H6 z! m. x# N3 Q4 }" G  b. j1 Z5 S% h
class C {4 W% ?  Z1 Q& m8 S4 v4 p2 r& b
int i;
! q, U! K+ r: b- q( q//...7 o8 d# S+ L4 `
public:# y4 A+ g# C* l$ ^
      C(int i);//constructor and implicit conversion operator! ~. c3 ]5 K/ o' V6 p* Z
//as well
$ k* a# B' ^+ U8 N; b: A' j};
0 D' c7 b: k0 C% p3 `/ |: @# E, I7 Y; E( s, G8 t
void f() {- o# n6 Y! I2 T+ c$ S* I0 o8 u
. n& T8 ^) T$ a: _" B
C c(0);1 A1 t6 _: G, k" E% t" m* V" X" B

" k- u/ [6 z+ B. l0 {c = 5; //将 5 隐式转换为 C 对象,然后赋值; w6 @, l/ s  q' I2 t* ^, s

' `8 n; {8 P7 c2 W5 I0 g/ k}
9 x/ y" Y9 K% k* @+ A; U+ v) s/ A' K0 }, t9 P! x+ @
编译器重新编辑上述例子代码,如下: $ c" P' a: ?; W/ f. i1 ^' X: c
; v9 H: s+ M3 Q
//////////////////////////////////////////////////////////////////////////////////////////
* r6 p+ y' b2 u  D//"c=5;" 被编译器转换成下面这个样子:% r: p1 Q6 a' X: [/ f/ ^
/////////////////////////////////////////////////////////////////////////////////////////+ F+ C$ v$ {& L2 G( {
2 _7 Y  V, y. F3 X5 y/ m" C7 r
C temp(5);// 实例化一个临时对象,* v& L, X# G/ i2 L' K
c = temp; // 用 = 赋值
( w( r: y8 g7 Y! Ztemp.C::~C(); // temp 的析构函数被激活) g" m( F$ G( O* c
$ Y( L  K7 T' b8 {2 g: h5 R# V
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
. ^# D# Y5 a, M7 `. X, p9 L6 s$ O' |) w
class String {
9 y6 \+ T/ T, u- r) q5 \int size;
0 W# @6 N: \; y  Uchar *p;1 `9 i' |9 F2 L0 ^  z" ^6 C8 q
//..
+ v8 C  ]2 Q# M: k9 o: t% Wpublic:
% B- k: r& q" I  F) ^5 A3 v2 g2 p4 ~       String (int sz); //这里不希望进行隐式转换操作0 P$ A* b# u- j0 O7 B
};
; T- E2 v8 p0 P; }void f ()" G- a* s, c4 V; X& Y. }
{) r- Y; ^) B3 @
    String s(10);
& W  h. Y; L/ }
5 q( ~; K. \1 Y* K" O$ K    // 下面是一个程序员的编码;发生一个意想不到的转换:
/ X( t, z% d' J) Q0 s2 F: U. Z- q. ~+ y7 I
    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
. ^% B. [& v8 p5 s2 _6 C6 h}
2 _0 N; C$ p! Y% N5 s( @) O# O6 L
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:% K, X) a, H3 b7 G8 j+ d; W) h

: o1 v7 Z6 c% v5 r: Eclass String {
5 P) w4 n1 ]8 x( x3 P) Vint size;
; |: B( ?5 B3 R$ g" ^char *p;1 E, O' e1 N# X) W$ j0 k
//..
, ?+ z) y1 c6 p  f# v7 X( vpublic:
3 T0 W! l* X5 w* \" i6 n       // 不要隐式转换; M' z* U) F2 Y7 z" ^% k3 y
       explicit String (int sz);
( @& ~& j: Y! I: S2 V       String (const char *s, int size n = 0); // 隐式转换0 P8 d# O8 a9 S6 H$ N2 O* K# @. r+ ?
};/ @7 j3 T- A* \4 @! X
! k/ i& q0 [1 Z! ]
void f ()! W& i# @, |! f* O
{
  x  E: ?2 G4 ?0 ]: Z0 Z    String s(10);3 K/ g0 G# `  o* l" k; b5 |) \
: s% x! K8 u6 N/ G" N+ o
    s = 100; // 现在编译时出错;需要显式转换:7 R2 x. Y- r2 `3 [2 p3 _
$ D7 v6 t. \- G6 q0 _
    s = String(100); // 好;显式转换0 C, U9 z; D' M+ m+ V- I6 M5 Z
    s = "st";        // 好;此时允许隐式转换
9 v6 _8 d5 ]3 S}
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
sabbanji        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

husir1983        

0

主题

0

听众

12

积分

升级  7.37%

该用户从未签到

新人进步奖

回复

使用道具 举报

txj66        

2

主题

2

听众

42

积分

升级  38.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

csenml666        

1

主题

0

听众

19

积分

升级  14.74%

该用户从未签到

新人进步奖

回复

使用道具 举报

jiner        

1

主题

2

听众

20

积分

升级  15.79%

该用户从未签到

新人进步奖

回复

使用道具 举报

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

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

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

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

蒙公网安备 15010502000194号

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

GMT+8, 2026-9-3 07:47 , Processed in 0.876715 second(s), 86 queries .

回顶部