QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6335|回复: 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>
9 v: Q2 z5 e& @7 g+ P. i2 m(Danny Kalev发表于2004-12-28 11:01:04)</P>带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:) }5 P6 _# _- H  g7 b! z/ v
0 r+ S- p3 _0 {. s* B4 n
class C {  V. i0 V4 |* F, V8 M+ [
int i;
0 m- ^8 x% o) f5 }; t& f( I//...! T9 k% V7 d' @6 g
public:# Z& n. S5 W3 Q, M
      C(int i);//constructor and implicit conversion operator& ]) D/ B2 u) [& q) ~
//as well
. \* v; D$ T4 H};
, A# C# y6 @3 H9 N/ [
. m8 K5 |0 `0 h; g1 D3 gvoid f() {( j& B" G, R7 G* P2 u2 J5 N4 D
5 P: o8 v. N* U" ^( I4 h" @* L
C c(0);; o% e7 t  @/ R" K
" @5 n$ k* w1 J' [7 ]8 W3 e
c = 5; //将 5 隐式转换为 C 对象,然后赋值
1 K) W7 _3 K: G8 I' z
0 ^2 P$ |/ P: \. V' L+ Z3 C2 i, B, E9 J}
- c) O) p: i" I& @* \* w
" w8 i3 w- Y1 T, N) z4 T编译器重新编辑上述例子代码,如下:
4 ]' c' X1 Z9 X, R( p9 S5 \* F- F
/ p9 _5 Q$ j3 B2 I9 E( c* J* Z( f//////////////////////////////////////////////////////////////////////////////////////////
4 ]) S) j9 V# O2 b) y//"c=5;" 被编译器转换成下面这个样子:
+ {: T2 k1 C9 ^- A% O  j) ?/////////////////////////////////////////////////////////////////////////////////////////
: q: U2 y, r# ^, m$ B3 g  g8 M1 B- T( K7 O
C temp(5);// 实例化一个临时对象,
& k3 ?( ~9 R$ @( c% `  nc = temp; // 用 = 赋值
( ~  J8 }5 Y# B" Utemp.C::~C(); // temp 的析构函数被激活
6 ?7 a  L, G) ^% O# H3 O' Y4 Z' X
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:" D" X4 Y( x7 V+ i4 p
" ]7 Y0 q6 i  e' H
class String {- E$ x9 `1 Z' G
int size;
( |: v% m& a" c' Xchar *p;
" ?) X& s, }2 I. s, ]( d, u% `//..% G# z9 O+ e% o; y$ T
public:
' p/ X; E$ d9 L       String (int sz); //这里不希望进行隐式转换操作
% h$ U5 T; V7 v$ W9 O& d};% F. y9 ]- C( K' B  r/ O; [
void f ()  l" w1 G0 H6 t7 D
{
, i- k- @  W2 N. }) j    String s(10);7 P9 `  J3 k' }1 S5 I4 G+ R

" t. r$ z5 g! N$ o    // 下面是一个程序员的编码;发生一个意想不到的转换:  O% P$ L$ v: d; d
. Y" [, L5 b7 Q
    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s* V7 |5 q& K4 n4 ^
}
, }/ w3 p/ W( r( R( `
/ W/ C' S/ X4 p8 L为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:' [3 q' W. p+ M5 T4 [

: x6 |8 W2 \/ X" V  ]- l6 r  Jclass String {6 n7 K! r6 H) v3 {' X
int size;$ l' P7 Y- a. b& r
char *p;
3 N, t8 Q- e7 _6 L//..
7 f0 X5 E* C# C, I. Bpublic:! c' M/ n6 ]% j; m, w
       // 不要隐式转换
2 r! @* w( \" {+ W& ^; J       explicit String (int sz); 8 K( f9 n  E1 B' n' ~* y0 l8 Y
       String (const char *s, int size n = 0); // 隐式转换' ~1 N7 f- ]4 ~0 e% K
};5 S! L* D4 y- t" y/ Q. u( K* V
# N( f( q. T% A4 z9 A
void f ()" v1 u: L; y+ T7 Y' H3 i- W
{
: N% c- C# |/ z* F& x    String s(10);
# s$ l9 y0 S* k3 V9 W
" E0 m8 X3 ^$ i1 z+ a- t    s = 100; // 现在编译时出错;需要显式转换:
* V6 \' }- T( M7 l* w' h8 c/ [/ b/ {( z6 H3 x. b
    s = String(100); // 好;显式转换% u9 ^( {! y9 b1 j: E
    s = "st";        // 好;此时允许隐式转换% T% A# D- o0 U4 B' n2 N
}
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
sabbanji        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

husir1983        

0

主题

0

听众

12

积分

升级  7.37%

该用户从未签到

新人进步奖

回复

使用道具 举报

txj66        

2

主题

2

听众

42

积分

升级  38.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

csenml666        

1

主题

0

听众

19

积分

升级  14.74%

该用户从未签到

新人进步奖

回复

使用道具 举报

jiner        

1

主题

2

听众

20

积分

升级  15.79%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-17 05:46 , Processed in 0.661173 second(s), 85 queries .

回顶部