QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6391|回复: 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>2 Y- ^# J  {+ A1 o3 }9 Q* V
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:# w/ T; c4 B: `- U. \- T
6 C) q" L& r2 _- W: m6 e$ y, V6 u
class C {% s: z5 O! v/ g$ ?
int i;
: K  u) a9 ~( K8 m& X2 c; a( K//...
" o- _! j; |& i7 i) @, kpublic:- Y* c4 W8 ?3 ^+ G3 B- Q1 p2 a# n
      C(int i);//constructor and implicit conversion operator
- R' N1 X. f9 i3 F2 x- N  }//as well6 t/ U1 l8 Z# f' Z
};
/ @# r3 S& y, J  G' \6 {) N
: u; p7 @" i* D9 _  k5 \! Nvoid f() {# C+ I' d0 v8 J# Y: g7 {0 X5 v
0 O7 T/ q2 U7 Z$ _! Q& [  v
C c(0);3 @5 Q7 f1 @" F6 x" ]
0 L( {, C) A3 F" F" i
c = 5; //将 5 隐式转换为 C 对象,然后赋值. Z& Z3 E& Q; ~5 n3 ]

1 l0 |- U4 ]5 G5 Y! D# C0 D2 J}
9 R( A+ h9 |# V: {- H* s" k3 h. w' i8 B& T0 J# t
编译器重新编辑上述例子代码,如下: . n" G9 N2 u- `2 @

* I9 @, T: i# |/ [//////////////////////////////////////////////////////////////////////////////////////////+ T- F% w8 w- @8 v% {
//"c=5;" 被编译器转换成下面这个样子:; r$ {1 E$ F( ~( C3 j' a
/////////////////////////////////////////////////////////////////////////////////////////! N' p/ x. ^0 h  Q% x
+ R! A8 M. E9 z4 H$ `  M  m
C temp(5);// 实例化一个临时对象,
2 z$ ]4 Q! y# y6 e# _* Wc = temp; // 用 = 赋值
& M6 P3 V2 R: h* ctemp.C::~C(); // temp 的析构函数被激活
: n4 K0 g8 S9 E) I4 p( p# u4 j. o2 d% p3 O& S5 y$ M) A- C6 H
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:. t- `! x* B1 s& B" V4 S' U8 L
' V; A& u3 U2 c& ~5 ~5 V
class String {5 d9 I% A/ K  J- P8 L3 S+ Q5 Q
int size;
% B  p' m8 }: ~5 {9 a7 Rchar *p;- h* j  ^" |* s& b
//..+ E4 S4 o6 G8 [* [: e+ O  O* ]
public:8 ~+ i/ C2 w; D3 P9 F, @
       String (int sz); //这里不希望进行隐式转换操作0 X3 l& I- N# E. q
};
0 X% J) W; L* F: [void f ()
+ L. {* ]' e7 g9 `{
0 U* R/ Z4 F0 N4 I+ L2 x1 W    String s(10);6 Y, \& T! g" S# ^

; s( e0 h! d4 `& U! x    // 下面是一个程序员的编码;发生一个意想不到的转换:! U3 j( `" u& s; G: ~9 ^

! l+ J* G0 u# r4 R9 X/ |3 Z    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s) X- A) g7 G) {
} 8 v" C" q! K, ^3 f$ D
* y6 x/ {8 E0 P1 ]
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
9 B1 _  q0 |1 k$ a8 x! [- `1 i- ^0 ?$ A7 M* d, |# z
class String {
5 ?6 v! q% [5 U: O! U/ [int size;8 D+ `+ q! y" o' C) r4 l
char *p;% c. A/ X$ h) D* D0 j
//..
: Z2 T# B+ E; X& _" W$ cpublic:
8 G' @# `: W4 M! O       // 不要隐式转换
' c0 i8 L. q  c' A       explicit String (int sz);   `8 r' Q9 }5 C* |. a
       String (const char *s, int size n = 0); // 隐式转换
! O0 l$ M3 p0 ]7 |: {0 ~};& p- D" ~6 i# B! Y: G

9 s. n" Z* a0 svoid f ()
6 q/ h( a* `! [3 N{4 W1 C2 Y! `6 e
    String s(10);( Z9 L7 c3 C6 m  C

& l) c1 ^- j, u: F+ k    s = 100; // 现在编译时出错;需要显式转换:
0 `5 ?, i. q# V8 O$ B& Q) C, N9 W/ \, n4 w# f8 K8 w7 O" H1 c  P
    s = String(100); // 好;显式转换% ]) Z) i% o" w6 k. i, {
    s = "st";        // 好;此时允许隐式转换+ I3 n- d/ w# l2 r- N# I6 Z" Y
}
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-7-18 19:27 , Processed in 0.771514 second(s), 85 queries .

回顶部