QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6424|回复: 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>
' V8 ^. G1 H8 |' o  ^1 }(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
5 J3 }0 u9 |5 w0 Q) Y1 m, d* g4 G8 E; t- _) b; e
class C {
$ r, n  a, ?. f, H4 u6 D* E: jint i;9 \; t8 N- @7 i7 `! g2 S# g
//.... t, K( t* U/ G3 g  k. Q) |% k
public:0 `( e/ v: p: ?: ^% @
      C(int i);//constructor and implicit conversion operator2 |, o4 B2 ?4 U
//as well
3 _/ x7 k( E/ K9 y};3 ^; ]  b+ V" x! Q
2 i5 B5 c5 J- b2 }$ ?
void f() {( U4 s7 h2 ]  g
- {6 }$ x. h. j- _. e7 Z( ]
C c(0);9 N9 b: \0 z) ~6 G3 j

) r3 q7 V" Z0 S8 r2 Dc = 5; //将 5 隐式转换为 C 对象,然后赋值
% q: u& l/ W9 u' N+ e$ t* J$ @3 X9 _& \
}
: ~1 s; l* V6 A9 w$ |% g3 F- c) u- ~0 [
编译器重新编辑上述例子代码,如下:
* D. f9 q# _' l! Y& |
$ r. c1 C- F7 `8 O6 f% A//////////////////////////////////////////////////////////////////////////////////////////3 h; ]. s- U' w+ g
//"c=5;" 被编译器转换成下面这个样子:
8 \- g! y  K+ o1 M9 K! V/////////////////////////////////////////////////////////////////////////////////////////
% L3 \% y% |+ @6 G) e$ s1 J0 R( h
5 o& l  z+ D$ b2 q4 ZC temp(5);// 实例化一个临时对象,' r% C; u( N, d# O
c = temp; // 用 = 赋值
& i6 J( Y' f0 ]$ L2 Ztemp.C::~C(); // temp 的析构函数被激活; Z& l! ?+ `: t) f0 ]3 k0 l; y

" D% b' @. M7 \在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
& n+ @( b# i9 W9 A( g
. F( H- |( r1 C4 qclass String {$ @! x. e/ L' M+ A- C3 X* y' W5 z+ X4 t0 ?
int size;4 ~' T7 D$ w  g9 R: q+ d# {+ B
char *p;: F- a% D6 B$ P1 W$ O
//..& m2 F# s* S8 E+ n: c- q  b3 }& V
public:
- S$ h! P3 F& z. Q( m( \& G, r       String (int sz); //这里不希望进行隐式转换操作8 Q6 k/ `9 s, }# g; v4 }7 u! L0 N
};3 o1 N2 L0 d' X# O$ p: H* T0 E
void f ()
: U  r9 x# q1 \* N6 t( h$ _, s{
) |! e& N6 D  I    String s(10);
0 e# v- g5 u. f
9 D) j6 Y8 |7 n! y0 i1 u: Q. o& g    // 下面是一个程序员的编码;发生一个意想不到的转换:
1 z8 K. U1 J. ~$ Y
% G: |5 O# f/ H: c' l. Z2 p/ Z- U    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
% d$ E1 G8 N7 @% D' Y3 k5 h}
" E0 t/ M- }, W/ w4 E9 n$ p  N( `! _# }4 Z$ c
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
  N- F8 W: w7 \2 B( m1 I& M. e6 U. h( ?$ k/ O
class String {* c8 C$ J# S) H$ f& ]4 R  Q
int size;  ^$ w% l+ Y5 b# @
char *p;
5 |8 g  _0 W* k% E$ U0 J//..
9 H- E3 a. O$ @: A7 |public:- z$ N9 a) H% g4 _  q
       // 不要隐式转换
+ D% Q; t, e$ T1 o" b( C       explicit String (int sz);
, g' u) ^$ A4 {8 ~# O, B5 v       String (const char *s, int size n = 0); // 隐式转换
$ h; m2 k) Q. A& {& i" X3 b};% ^6 I; U$ Z3 b3 a* z

$ Q2 E2 N9 a, I+ uvoid f ()% M5 w  a2 d: l3 C9 `- D
{  _- {+ `! [5 E
    String s(10);( q- e& \3 B( n0 U( z# M
* Q0 Z3 y$ K0 R1 g; d9 @
    s = 100; // 现在编译时出错;需要显式转换:
0 V$ h. d  Q6 v7 k. _! v( z. k- S" M* h) z+ A( o
    s = String(100); // 好;显式转换" E! ]3 s9 H4 d( O  \
    s = "st";        // 好;此时允许隐式转换) w, a- z0 X& j/ J# a: ^
}
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-3 06:45 , Processed in 0.512338 second(s), 85 queries .

回顶部