QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6394|回复: 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>/ [6 i' @1 o4 f
(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
- t( D) K6 D, M* |: K, w5 p
8 ]2 G  F  s$ g7 ]/ I8 d; R5 uclass C {
! B4 q% R# E6 y( \8 n; Fint i;
  `2 E( h; A5 v! s# H# ]2 ?" Y$ m, |//...' Y2 M( [4 V4 r5 i& E! z8 x
public:5 O8 q- t1 j5 g5 i! a# w
      C(int i);//constructor and implicit conversion operator& `& ^" |* f3 ~
//as well) n$ _) N; `( h: N
};- c; t/ i3 a9 u2 D4 y" A
6 h) n; t0 _6 ?. i+ N7 e) R
void f() {! [/ D$ `) _7 l% U6 p

1 a1 }  ?" S7 u$ wC c(0);
5 l5 b# u! N% O1 W- ^2 ^
) |2 a" n$ e( y, q" Yc = 5; //将 5 隐式转换为 C 对象,然后赋值% [9 j# [0 j# i; o, k
- x8 A' t# l( ^$ n% i6 j
}
" m3 K' Y/ x) D: ^& U5 ~, @9 n0 u4 w! ~/ A$ h" \
编译器重新编辑上述例子代码,如下: ) C- q1 _8 q3 m& k

" Y; l$ ]5 U8 U8 \. L3 E5 R! \//////////////////////////////////////////////////////////////////////////////////////////
" K& k: z, }, P) U, d//"c=5;" 被编译器转换成下面这个样子:
) ]/ t+ q7 M4 V4 _6 B. Q1 y& K. ~/////////////////////////////////////////////////////////////////////////////////////////
6 p9 G- @. o- E* w! x' |2 m! d: A# D+ L3 _2 p! l
C temp(5);// 实例化一个临时对象,+ t3 ]. ^  Z; g+ @
c = temp; // 用 = 赋值
" ]1 |4 O. r( r$ L- A; Vtemp.C::~C(); // temp 的析构函数被激活
  \/ o2 c# N/ g& p3 g% k3 T6 D1 U. j+ \, D- b6 r
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
( A% _5 s; J3 t% |( o9 J/ q3 H+ M* F, R/ }, Q
class String {: ~: ]! l7 `2 O" F1 H% f( ^
int size;% T$ w3 H- z% K" |
char *p;9 [( g8 }4 ^  ~) d' e/ X# K
//..
# C8 V4 K, v. t! Epublic:+ v7 h# k- u9 o' j! _7 @  a; C
       String (int sz); //这里不希望进行隐式转换操作
/ y$ M+ `+ x2 Q6 ]( C" i};
: |7 k8 \$ E( V) \$ H; [# U8 ?; d" xvoid f ()
7 h  i. [9 O5 p{5 E- e9 y, c7 e/ y# c% p1 T7 G: R
    String s(10);
/ a; p4 \+ j5 i6 G9 L+ z
  E0 m/ b! O& K5 M3 J1 u    // 下面是一个程序员的编码;发生一个意想不到的转换:
! n, F+ O# E" n9 a5 f4 `; b
8 {, H% X& u1 _8 Y5 b; S; c/ _; B- ^; n    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
9 j+ x" [8 L. ~3 X( D( H} " F1 Y" ?8 t: ?) W1 a
, g! S& P' n6 z  T. r
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
9 m6 `7 S% R) E; z, s: R( \  x8 \* }
class String {
. [7 j. S5 n7 `( Y) tint size;
+ A9 `  {: e, r6 ichar *p;
* d5 \! p  i4 B7 G: K//..
" _2 l$ w8 C! E) H3 J3 o! w. q: ^* Epublic:
( F$ k- O" L& q; e: ~' b. c5 ]       // 不要隐式转换; g' j' f5 F: w8 M
       explicit String (int sz);
6 M* x7 E% Y8 I0 a       String (const char *s, int size n = 0); // 隐式转换
9 j; S7 y% \& n( Z};
7 O3 g. p* V  f1 J7 ^( b
  a9 u& O# w0 r  Rvoid f ()
! N! H1 g5 |9 @7 d. d{
' e& G! L, c" C: C" z- y$ i, ?4 W    String s(10);
. W7 S4 P9 A# l# b4 b% z/ j3 J  H' I
    s = 100; // 现在编译时出错;需要显式转换:
( F- ~+ u/ t7 J0 D$ E7 a" Z  i& E' w7 |6 p6 s
    s = String(100); // 好;显式转换
# X& @5 }# e5 k! [$ M% v' {    s = "st";        // 好;此时允许隐式转换) u6 [, r( l7 V4 z; J: y( i
}
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-19 14:13 , Processed in 0.621345 second(s), 85 queries .

回顶部