QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6395|回复: 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>; j( c7 P* h7 i$ i$ ]- k
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
1 ]/ R. ^, P% c. u( y5 `; G  O
/ K' E  Z3 H5 d9 Dclass C {
7 `3 }. B" a9 f7 }int i;
: }. U4 s4 D% X3 C/ B2 Q, i//...& J$ F0 B6 t' ^/ A5 U; p  y
public:; F% L- q3 W, {6 r7 e# T* \
      C(int i);//constructor and implicit conversion operator
8 S! v- r/ F0 O9 Z( W& z! f- v; `5 t//as well
- N# V5 r) o" \' D};/ L. x& o7 O2 \8 V) Y8 H
2 D- L% F# I8 [2 d$ `) V7 P
void f() {+ x: ]8 M4 H+ }( I
6 t$ n5 z) _- X8 R2 @% J7 b
C c(0);
+ ~* j6 n- H$ T+ m
- F# g: b4 X" f/ T) q5 |c = 5; //将 5 隐式转换为 C 对象,然后赋值. n) C2 c! A9 V8 l3 l
: Z$ D: N& @& x& e: p# [
}
2 o7 n0 ?( \6 U& D, D; s1 v, l/ e3 a, n5 g2 u1 d6 E0 g
编译器重新编辑上述例子代码,如下: " L! |8 m; ^. C0 ?  |  j" T8 E

' G- w% N! Q2 A, i4 a5 j//////////////////////////////////////////////////////////////////////////////////////////' A& n: j! n& v) e5 O5 U
//"c=5;" 被编译器转换成下面这个样子:
3 E: c0 b' D1 _- R! y4 L/////////////////////////////////////////////////////////////////////////////////////////
: e, n/ Y( E3 B: m
$ `" m7 t' _7 C6 S1 [C temp(5);// 实例化一个临时对象,
, W& Z# J/ f: ?: g, g6 v3 cc = temp; // 用 = 赋值
) I/ S- ]- T8 `3 r/ w8 p/ Htemp.C::~C(); // temp 的析构函数被激活
/ L0 z/ A, d! F6 k- [( O6 l4 @- V6 C! R
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:# g5 h2 q9 T( }
4 M& W1 `, g+ ~. h. p
class String {% j" T- U' |3 K" d7 F
int size;
' h* D9 z  H- b9 d  [  o% Hchar *p;; O6 X# _5 Z2 Q! H8 ^% ^1 Z
//..$ F2 G0 l) }5 C% z3 f
public:8 [4 k( K" Q$ G8 s9 d/ H
       String (int sz); //这里不希望进行隐式转换操作
0 n. y( C7 P8 x' n, O};
, F8 M9 j5 z; r+ xvoid f ()
7 y9 `" J' ^1 r3 ~5 t8 v6 Y{4 H0 H, b) `4 `5 @. C$ F( U& C  g
    String s(10);
+ Y8 U: B6 i' \! i  D0 O/ t7 l& t
    // 下面是一个程序员的编码;发生一个意想不到的转换:# _" k  R% R' {; {* G- |7 N
- Z* N/ D8 @' |# c
    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
/ @: ?6 `: g9 n, N}
+ Z+ R2 R- f; X0 N9 Y- C8 c: q# w& U; s, d& V' t  d
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
' a6 U, G2 {" f9 M8 R* ^7 y( ~9 G# f0 D
class String {
3 f* w& Q% y( O; |, `int size;
, S2 I& v8 k7 D3 T/ b; Wchar *p;! t! x& N8 V4 c& c
//..' L8 M; k7 u# ?/ v
public:( a2 v" o" y7 V1 \# H) k
       // 不要隐式转换
* I, R' g6 ~/ ^2 D# {: L- L       explicit String (int sz); 5 V9 G+ [( ~3 {9 G$ B* K
       String (const char *s, int size n = 0); // 隐式转换
+ y6 B5 a8 m# b7 G5 q};, b4 @6 l6 U* f" E7 O. W8 n
) t$ B6 }, N% Z
void f ()6 ~7 G/ `. }7 V
{5 b$ v" M4 Z$ U
    String s(10);  l4 n/ l$ E4 [3 M# N, P2 P! f
  [1 Z2 @4 M% b% W( e
    s = 100; // 现在编译时出错;需要显式转换:+ b# y4 `. y8 r4 s
- e! O" S+ `3 [( g, G
    s = String(100); // 好;显式转换" S- A8 w0 [& `7 b+ h) t
    s = "st";        // 好;此时允许隐式转换
' w+ t( m  h5 H; 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-7-19 22:01 , Processed in 0.497915 second(s), 86 queries .

回顶部