QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6421|回复: 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>
4 X, i* a! D# i3 r2 {4 H(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:  Q2 V  {) m# p- N7 u
) f3 N# `- `8 A% b7 E
class C {
  v" z4 \3 m! Q, kint i;, C7 r. Q! x' |
//...
1 _1 D% i* C( {4 }public:, ]$ w. R' |) n1 T2 r4 Z
      C(int i);//constructor and implicit conversion operator
9 L3 r9 H. g5 I9 w5 E) H//as well
0 `7 N1 d) |+ L' c* V0 R};' s- n3 a8 ]( y8 v- @. [8 e. |
# s+ V6 H) D9 ^5 R3 ~% T! B
void f() {
6 B# N( F- S  ^4 r+ b( n2 \" P5 L) Z3 K7 \
C c(0);# v( S/ r! p) M3 u. ]+ O

% V% W: V+ X% \6 X$ Q+ P0 T; Tc = 5; //将 5 隐式转换为 C 对象,然后赋值
. P2 r# a1 ~2 m3 ~: m! h+ j- w
* k- {* a1 O- x1 V2 o}+ ^2 I9 S  @) w" ?6 @' x# m

0 h" K6 b1 p" U8 V9 H编译器重新编辑上述例子代码,如下:
' n0 a3 L! |( v+ D  K, N' ~4 l) h* c
//////////////////////////////////////////////////////////////////////////////////////////
- ]1 O+ S0 v9 L7 O//"c=5;" 被编译器转换成下面这个样子:3 ^) ^" A, S/ Z( V, J( f/ r. P7 A
/////////////////////////////////////////////////////////////////////////////////////////
5 [3 G/ [# B. O3 y6 K. d+ v' d3 ]" A4 H
C temp(5);// 实例化一个临时对象,
5 H# x' L% J, @4 G! G# Wc = temp; // 用 = 赋值3 j6 a& X1 `) n4 y' ?, F4 E7 e2 y
temp.C::~C(); // temp 的析构函数被激活
' k! X& s, Q% f# T9 A/ r: Q
/ X) A* u7 L' e/ z4 e6 P& k3 [在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:3 l/ m0 Y/ I% t4 n
2 H: y% L: b/ H
class String {, b$ [4 O! y  P
int size;* f4 i& J. f" T& E! J4 ~5 P
char *p;$ ]/ z! q, C/ Y" d) T; s
//..
, A# [+ ~, V$ \! n& tpublic:
5 c- K2 O: W( b+ H9 A) H2 T       String (int sz); //这里不希望进行隐式转换操作
% T4 a6 N9 z5 \; T};/ q8 u6 L7 m; h( D) R& k
void f ()
# F! T( |* R) m6 p6 {  R9 T{7 C6 ?4 O9 M% a& C6 Y
    String s(10);0 b9 s) g1 k5 g1 N3 e' R. y. w, T
3 g/ [& w6 A. L3 M. A- P( h
    // 下面是一个程序员的编码;发生一个意想不到的转换:4 o- T1 h2 b0 P" ]$ J$ d( i7 e- w, H

9 |1 i  x. X. `    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s1 ~: T; [+ R2 K5 t4 N
}
- f7 V: C  z0 Z! W5 j8 r7 x' O/ T% {& i' H( K9 N# M9 r
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:# j1 X' p/ P1 c+ ?+ D+ ?
( p. `, A" L0 h) \7 v
class String {
, B+ G" k  j9 z0 d% \% J$ c3 J: |int size;( D' k+ @% l: @
char *p;+ O3 ^* w! M3 T3 c- F
//..% d' o+ K% x; Q( {% |4 C
public:; g/ [+ u  H) h) \
       // 不要隐式转换
- m) u9 k6 @, z7 b+ e       explicit String (int sz);
. p. ~% i' m5 y. A3 S0 |7 A1 j& `       String (const char *s, int size n = 0); // 隐式转换
4 f( d% ?' D. d; @: ~0 N};& r; I" e! A0 _9 f& W: n9 r# N7 F
) A: h% z$ y4 y
void f ()
7 H! J8 n# G9 C3 r{# a: `+ u: y0 _6 K
    String s(10);
8 B7 {( D; _8 M( {/ |" I2 `) H% |4 J- F- u2 I4 M
    s = 100; // 现在编译时出错;需要显式转换:
2 W4 H: s- w+ C# N4 s+ m3 n5 S& F$ ^2 d. J  j1 [
    s = String(100); // 好;显式转换3 d, x+ x6 G% l! I' I# m7 y
    s = "st";        // 好;此时允许隐式转换
3 I. p# q/ [4 T% s4 s! ~}
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-9-2 11:05 , Processed in 0.524991 second(s), 85 queries .

回顶部