QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6086|回复: 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>0 d* N% V" c$ u% @
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:* n5 o% Z; T) {! K7 _/ Q( x
- k% @# p4 `/ D- X, t3 [
class C {0 J+ a- V: v! p" H" `* t
int i;! i7 y' u6 d3 |3 I. s, K; ~* E
//...4 f, o% m2 k- ]( W! C" A
public:
5 [5 Y5 `: X$ p5 F      C(int i);//constructor and implicit conversion operator& p- l8 x# |8 V
//as well
8 N2 q  b% P3 Z  Z$ B: {};
/ ?5 v; k1 a( N6 o, j  ^5 @( M( @* M) O  R2 _/ b' c
void f() {8 O% |9 X* h& Y# w0 a% I8 l5 ^1 Y: _

* }$ P* M* G# h" {) FC c(0);5 {: R2 |% R# W! }- @7 x8 s5 B
2 k$ B0 }, y; ?% i8 Q: H) E
c = 5; //将 5 隐式转换为 C 对象,然后赋值* z0 I/ f$ Z( j' v/ B
. a- y* Y' u$ C
}
* r) r4 T3 A8 B) d1 Y8 D+ u8 B+ J7 ]9 E% x- p9 W) X
编译器重新编辑上述例子代码,如下: 8 U8 d, L, d+ @7 k/ n9 h3 y
- q6 {, q3 W' F) j. i
//////////////////////////////////////////////////////////////////////////////////////////
7 W; P1 B: b* [//"c=5;" 被编译器转换成下面这个样子:
) I% b/ z/ ?7 Y+ _* s/////////////////////////////////////////////////////////////////////////////////////////# o# E* ?8 h3 a5 d

: z$ Y8 [9 _7 F& eC temp(5);// 实例化一个临时对象,
$ S2 P$ C# T/ ]$ uc = temp; // 用 = 赋值8 k1 W! |+ j, L3 c+ u$ g
temp.C::~C(); // temp 的析构函数被激活
2 b2 _  g; ?. \- u
  v5 u2 e& E, Y  c; a% q0 O在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
$ f- i. ~! b+ B! H# r. v
$ g% \- a! s3 Z  u! p* c3 Yclass String {- ?; D8 C! D2 X; |) Z/ y. ~
int size;
; u5 t( q& c2 {2 h0 Wchar *p;
' S, f" W* }: R; D0 c# N//..& ]# B9 @6 H1 ?$ @  {0 X. [/ W! v
public:
4 N; q. w. V$ A       String (int sz); //这里不希望进行隐式转换操作
% T) r* f7 ]$ Q};
( d8 B$ D, t$ H. G9 S! Wvoid f ()! C$ l7 @& T1 v  [: t+ S5 V
{
7 v  E/ }' ^; F: h1 C: L    String s(10);- T4 {4 X6 X. Z" O
# p( }2 _  g! u/ a7 e
    // 下面是一个程序员的编码;发生一个意想不到的转换:
5 F3 e9 ?& {& ]! m. L% C
# \& U# z# P$ ?" h    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s2 M; o( f! f* ~& n, y3 Z; o$ X
} 2 F" U) s2 J( Q& L. S

. O% `& G9 B. s4 E% o' K: {- o为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
# X9 c8 X5 c3 n: R0 K  M. R. y( j2 h* S1 P& ?8 B
class String {
2 i& x. h' a6 V4 s8 t5 ~; B8 p, lint size;; ^  g0 x& a4 c1 M! A6 v4 L2 X
char *p;
. U' c# Z" @6 U, e4 i) }9 U//..
& A  \* c' j2 d+ W, y# Opublic:4 j& x! V1 I: y( F% B) d
       // 不要隐式转换/ a+ p3 j( S6 i# E
       explicit String (int sz);
+ z; I+ M' }- c1 M3 D       String (const char *s, int size n = 0); // 隐式转换
3 R) f) \7 s6 {};" B; |5 b& y3 I) N2 R
1 Y1 r0 w3 w" h
void f ()4 s7 _) {! g: d* T( D- p' n4 b
{
, T+ s" p6 s7 H9 p# g# Q5 ~' R    String s(10);
; }7 L+ @3 D* G- z% i/ F5 I6 ^; @2 ?( g+ f/ C  i/ F6 p
    s = 100; // 现在编译时出错;需要显式转换:4 }! L- q: E4 x3 {! L
1 W) N6 k7 z. q# ~5 A& m9 Q
    s = String(100); // 好;显式转换
! ]/ k6 S6 m- a3 }# q6 o    s = "st";        // 好;此时允许隐式转换. O+ R  w* R1 [9 Y0 \6 @
}
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-29 03:00 , Processed in 0.678020 second(s), 85 queries .

回顶部