QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6081|回复: 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>
: k( I4 I1 |6 g7 ~(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:% z! M% e& E) R% b, F# @3 ^

* @! Y) ~2 V7 m, L! o9 k; [class C {8 M5 e/ Y' V" f; a
int i;: m) {. a; Z# m) g3 }
//...
8 Q- s; @6 r& e, dpublic:
3 ~3 X( z0 `  {3 W' \      C(int i);//constructor and implicit conversion operator
7 \; N/ M! p6 d: j//as well, h3 ]4 d7 y( h, P% f0 y; k) o+ A
};. {$ B! q5 K& B* n# s1 T' N6 _# ]% u

+ G. F7 b  \% w8 F7 p$ _3 C0 Gvoid f() {
- m7 o) s" O7 {
& i" W8 C- k9 C1 l2 PC c(0);! H, i' G" a' F1 t' w  G
* g$ R8 j/ [3 W+ h; i4 \& M
c = 5; //将 5 隐式转换为 C 对象,然后赋值  [  F' H5 O/ N+ y, L0 b
& C) l4 V" [7 E7 J: [: L
}6 n. W0 V+ S( d7 R9 Z1 h2 v3 H

9 P% z, f# Q/ d8 X编译器重新编辑上述例子代码,如下: : K5 Z5 l+ e" R
3 }; T: }' W3 G  f$ b0 u
//////////////////////////////////////////////////////////////////////////////////////////) x3 ?5 ?* o& e) `8 B. N
//"c=5;" 被编译器转换成下面这个样子:
0 X- M' a1 a/ u6 e3 m" Y% l/ s/////////////////////////////////////////////////////////////////////////////////////////
+ v5 d4 s* R6 G% _4 X( k& o- B2 H( b* s
C temp(5);// 实例化一个临时对象,6 }7 V/ B; e% C3 f" E% N  ~
c = temp; // 用 = 赋值
8 G" B/ A6 G5 D( {0 E  x8 Ztemp.C::~C(); // temp 的析构函数被激活
3 a/ ^' B% i) G$ V4 r$ |, o) L3 v  G, w/ D$ w# t
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
# E5 ~0 A8 f4 b! r8 y* o9 K2 V/ u
class String {
. K; o: x9 ~$ hint size;
7 i, b" g& I7 n6 M* P# ?  m6 rchar *p;
" [& E& n# o/ i( B//..
! j% E5 B6 T4 _! ppublic:
' x' k# b! H7 Q6 O+ c5 ^0 v$ w6 H       String (int sz); //这里不希望进行隐式转换操作
& v* `) k# F* L; _& Q};
2 I2 G  ]- v8 _8 j) svoid f ()7 A- t' @- Q2 p+ u+ B/ R. r+ T
{
. U, N* y5 \1 k7 r    String s(10);
8 n3 L# `7 i, _, x9 k. d! q0 E- x, T- h( j4 w
    // 下面是一个程序员的编码;发生一个意想不到的转换:  G0 I+ b3 T& y+ T8 G- J6 Y
) b: l! ?& a( {: e
    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s1 D6 O, X1 P8 t; Z9 M
}   r6 U, R# K, q/ H, O/ x* I3 r1 C3 L

' Y7 M. O; o8 h+ W1 x. T为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
+ b( y2 G7 T0 n. k) {0 w! `; l: x5 c4 Z, E3 G) \1 V
class String {" ]) {% B0 S- ]( h* `0 [
int size;
- F0 J# D0 v# M. l$ Ochar *p;
. C( Q! B2 ~! ~* w, t# D//..* P' i* n- f! @: P2 E/ H3 y- [
public:
. I& w( }  r: |% V: t0 ~       // 不要隐式转换4 z7 l% C5 y$ ]3 Y" [) `1 t
       explicit String (int sz); ( y5 A7 I. X: J  ]" {+ X0 ^8 @
       String (const char *s, int size n = 0); // 隐式转换
' C! ~! W6 {  V};9 ^) @: `- L! j6 x' l+ I
1 j0 e( ]7 ?. J" g/ G1 }5 B
void f ()
' d4 H. j& ?6 O$ y{
. _. ]1 P5 d% P5 Q    String s(10);/ _& I# j7 ?" {
8 G$ I$ B- t9 s( r& A1 g
    s = 100; // 现在编译时出错;需要显式转换:. N/ V" g5 |( g( Z6 \( h# G

8 V$ c; K/ U- q    s = String(100); // 好;显式转换
$ ?  L) d# S$ L$ D, p: ^0 m6 B    s = "st";        // 好;此时允许隐式转换& {2 Q2 a! H. O9 i* X
}
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, 2025-7-26 16:06 , Processed in 0.686084 second(s), 84 queries .

回顶部