QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6340|回复: 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>
3 D, L9 M' y* @' ]! y(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
* f( R9 c3 G$ O2 ]8 [2 P+ P
- Q' i0 I4 w% a  W0 K4 h* Q( W! y. Iclass C {
8 w, @4 j  D& h) ?int i;
$ R# _0 F. m5 B7 D//.... o% c5 ~* Z, B) W. G, S6 H4 }
public:
9 `: w( C' [) S& L% h: B3 ?      C(int i);//constructor and implicit conversion operator
) H% y: k# _/ o( p& r( T$ |( Q! g//as well
/ R4 O) g: [7 q; U4 V};
7 x+ D/ v: v- L. ~$ R9 h: B. ?% d* R' }
void f() {" G# J" ~4 g6 v! E; q
3 n$ T. ^1 q! i0 f: {3 Z$ v) [2 |
C c(0);
7 E& X8 T, f, k- `% D% Q# I- M8 P6 S2 n
c = 5; //将 5 隐式转换为 C 对象,然后赋值& k7 Z8 a- s% s) C  {

. v! {  s7 [- x' ]  J8 G9 y+ F, ?}& z& I2 n- m9 X

; d1 h$ k9 X4 [0 K$ O编译器重新编辑上述例子代码,如下:
- `, i8 y0 |& t* N# m1 X6 v+ ~, a2 J* ~
//////////////////////////////////////////////////////////////////////////////////////////
( i! b1 ~8 Y4 i. i8 K//"c=5;" 被编译器转换成下面这个样子:' K) f( \. i$ X4 ~4 ^9 q: P  D) m/ F
/////////////////////////////////////////////////////////////////////////////////////////
& H5 u# O& D2 s$ l
4 C5 l* h- J' @C temp(5);// 实例化一个临时对象,
( S' H9 Z! }! b% v/ k4 c/ cc = temp; // 用 = 赋值+ n, H2 Q3 C! V+ U
temp.C::~C(); // temp 的析构函数被激活
, @5 |: r! [4 n* o" ~+ D# Q  n, j, Q" K- [' z6 E; M( N& R% `5 R# K+ Z
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
* X3 n/ B4 _9 ~  ^* L+ P; q( Z; Y. g0 I0 h
class String {
/ [: Z1 n5 k" e7 uint size;9 F. k! {4 ]/ N  i1 I  J! b5 U' j* O
char *p;
$ Y$ P# j! H0 v//..
+ j# T. w4 {& e' bpublic:: S( A$ x% X$ H; f: y# C' h3 S( m7 P
       String (int sz); //这里不希望进行隐式转换操作
8 t( l( w5 P: ?# [};
* y# S" v, v! ^4 g5 M* g3 ~; Cvoid f ()
5 L$ s  d, n2 Y% l* s* C, D{' B1 G$ A) ^9 n6 ~' M8 k
    String s(10);3 X( C. M: g# J! w" r7 ?* u

4 s  {  E7 u5 [    // 下面是一个程序员的编码;发生一个意想不到的转换:& @3 i3 ?+ ~% m/ \4 L: s0 [' M
1 \, T3 f$ _1 E9 h" s
    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
. d) i1 s! f. U3 P, E3 k}
8 u- y* [, s0 d7 k$ C! |$ C1 m
+ W0 O1 A' d3 t% S" f6 x为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
% D7 r$ ~/ J9 L; X1 i. P% O8 t- e  Z$ h  m$ m) X2 R+ n
class String {
  D2 y) F  Q" C4 [: x5 Xint size;6 j8 `) A5 C! ?  f, T. c- {* d
char *p;7 W! ~+ ], R1 ~% y# s+ S
//..5 U" Q* W& f- \3 c- L! K7 s
public:1 n8 G3 H- y2 n( m, w5 |0 m# n# x- @
       // 不要隐式转换
9 ^8 _# o0 ^/ Z+ t0 b, }0 V& p( \; z4 t       explicit String (int sz);
  v5 L( m  |5 C       String (const char *s, int size n = 0); // 隐式转换" m  ^0 P2 V( h6 e5 Q
};9 M/ ~" E. L1 I! v0 {; z
6 P0 M0 V9 y! H, m, {& P
void f ()
7 v" l+ w* r9 T5 ^  R{9 @: z, q; E7 B$ B/ k/ c
    String s(10);
7 F0 m7 `, e) g$ i7 j+ k& H: b3 K
    s = 100; // 现在编译时出错;需要显式转换:0 L- u4 `6 a: f* U4 ~+ f
- z& g; R/ ?9 T0 [+ m' K: k) z* k: Z
    s = String(100); // 好;显式转换
& k$ q& W; _8 W6 j3 t6 E    s = "st";        // 好;此时允许隐式转换9 V0 `& T! k! e# }# i. e+ [
}
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-4-19 02:00 , Processed in 0.475928 second(s), 85 queries .

回顶部