a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 253|回复: 4

[C++] 2012年计算机等级考试二级C++辅导讲义(8)

[复制链接]
发表于 2012-7-31 21:56:58 | 显示全部楼层 |阅读模式
C++重载类型转换操作符(type cast operator)   boost::ref和boost::cref使用了重载“类型转换(type cast)”操作符来实现使用引用类型来替换模版参数,本文就介绍一下这种操作符的重载方法。
$ _7 `: E; |4 v& l  函数原型$ M/ b) z: i7 R% q  p# P
  T1::operator T2() [const];   //T1的成员函数,重载"(T2)a"操作符3 [- Q! _0 Y  a3 ~) O+ w
  1. 类型转换重载函数的返回值是隐含的,并且不能显示声明,返回值是与转换的类型相同的,即为上面原型中的T2。6 v3 d. j: @9 F. q! T3 d. A5 I; J
  2. 不能有参数;
" [  S2 t) M! o8 |+ R  3. 支持继承,可以为虚函数;) X. X8 B, }( i. n
  4. 支持使用typedef定义的类型;* |; F- J, J2 w$ Z2 p2 p6 Z6 j
  先通过一个简单的例子来说明如何使用类型转换重载* c) u' r0 t  {/ H$ ]  K" K! y
  1 #include
( f2 _- j+ n+ ]4 q  2" D1 w1 G( n( t* N8 J; i
  3 class D {: M8 a8 u# ]4 U
  4 public:# q4 G. x( Y) e1 ^
  5 D(double d) : d_(d) {}
. q& E2 J0 W" d3 J1 b( b( Y  6& \0 @+ N4 `: H& q
  7 /* 重载“(int)D” */
+ g- m4 z4 K# S* J/ x( o  8 operator int() const {9 u# [# s  H8 a. a" A
; x- S, U0 Y" i" `" n9 f+ h& U
  9 std::cout
回复

使用道具 举报

 楼主| 发表于 2012-7-31 21:56:59 | 显示全部楼层

2012年计算机等级考试二级C++辅导讲义(8)

</p>  在24行执行add(d1,d2)函数时“(int)D”重载函数将被调用,程序运行的输出为:9 {# y% S& [7 Q" X5 i, R+ u
  (int)d called!! L% f! C2 N4 r4 _- U
  (int)d called!8 ^& U. V0 R4 E2 ]  R# {6 A
  3
$ x' J1 B* ~/ ]( \  类型转换操作符 vs 类型转换构造函数(conversion constructor)( ^/ A4 A( i* y9 u1 Q! d% T9 ]& X4 f' u
  有时候使用conversion constructor就能实现类型转换,这种方式效率更高而且也更直观,下面举例说明:
  U( _2 O2 r7 Z, z1 b4 S  1 #include
* g& ?; b& ^; }  2
. C- l# K* V# h1 a5 o5 f  3 class A
; y# e( F" `2 a* m7 }  4 {6 o& z9 {% T8 l0 y
  5 public:+ g/ }5 a: w7 u1 B* J
  6 A(int num = 0) : dat(num) {}$ p1 E/ ^* R0 G- g2 ?& p
  7
% X+ H9 \) \$ b* G/ Q9 N' L  8 /* 重载"(int)a" */+ n3 F2 b" \+ Y9 D$ q
  9 operator int() { return dat; }
/ N" q( r8 N, M9 y/ b+ E0 x5 _  107 q/ V8 O. U: u
  11 private:
5 q  Z/ \" V( i' M3 j7 n+ H; ]  12 int dat;
9 w" K' E0 L' v5 }2 r" I$ S  13 };$ l2 A1 K1 m, J  f' n
  14
6 Q9 L/ ~, p# P/ q/ [3 ^" J4 \  15+ F: M  q/ s; W3 u
  16 class X
3 [  ~1 V& V6 C! s: d/ _- e) D  17 {: v% p- Y. x4 Q& j' r3 ~3 [9 T
  18 public:
5 O% m- }/ ^  m7 L  19 X(int num = 0) : dat(num) {}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:57:00 | 显示全部楼层

2012年计算机等级考试二级C++辅导讲义(8)

 20   21 /* 重载"(int)a" */
  m; q  M$ n  h; T  22 operator int() { return dat; }
/ {1 I/ m0 S: d2 |  23
, L& B* Y) s4 C) P  24 /* 重载"(A)a" */# {$ ^5 X6 t) d2 I
  25 operator A() {
6 ~0 X- S6 V! Q, N+ z+ S  26 A temp = dat;0 G+ h+ h7 E2 |9 l5 E
  27 return temp;( V% a; W* i, s
  28 }
  l5 p# S$ ^8 i- R' N  291 A3 o2 a4 T; B3 Q4 J% w
  30 private:' E% {  E0 c2 X" b
  31 int dat;3 r& D0 n1 I; ^4 x+ l7 @
  32 };
$ t4 m* s% H$ D2 U& p  33
0 n* F, i" b2 e4 L; L5 u, n. v  344 `: M0 K- P" P5 \) x
  35 int main()" U8 }7 }, L- O+ U, x" ]; i1 ^* K
  36 {
. v" m. P' _- [/ D- U3 f- E' P4 _  37 X stuff = 37;! b' r9 c7 Z8 J4 z1 {0 g
  38 A more = 0;" j+ r3 `- @/ W6 \+ B
  39 int hold;
& t( i* U7 l2 A/ }  40
! s: J) [% }0 Y4 m8 h! u' ^  41 hold = stuff; // convert X::stuff to int5 B! R* z: j: ^# V: ^0 t
; R$ i. N, {8 s* O) q8 |
  42 std::cout
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:57:01 | 显示全部楼层

2012年计算机等级考试二级C++辅导讲义(8)

上面这个程序中X类通过重载“operator A()”来实现将X类型对象转换成A类型,这种方式需要先创建一个临时A对象再用它去赋值目标对象;更好的方式是为A类增加一个构造函数:   A(const X& rhs) : dat(rhs) {}# \" Y7 P5 U% k
  同时,请注意上面程序的第45行more的类型在调用std::cout时被隐式地转成了int!! r: [# W# }& Y0 ?( e7 f0 w
  一个简单boost::ref实现* y) ]1 Z; |* \  Z# t/ o+ N
  通过重载type cast operator,我们就可以自己实现一个简版的boost::ref。4 u+ p; n8 ]5 y6 D6 k4 c. r
  1 #include ( Q! V7 `+ V+ k" C& }
  27 C# p% S1 p) Q+ \  I
  3 template 0 R' I: B; k7 g( _' n
  4 class RefHolder7 _+ I5 ^& B& n. K
  5 {" J( L7 M$ D0 n$ n$ L, H* ?
  6 public:
" }1 F( }' i6 A$ T) n  7 RefHolder(T& ref) : ref_(ref) {}9 [; ?( m" G7 Y! j( n/ H: D
  8
, l1 _2 w" R7 e$ f3 s  9 /* 重载“(T&)A”操作符 */  E* z$ o) d) n
  10 operator T& () const {
7 f' F  x& k9 H' x5 \  11 return ref_;
  l9 t% P$ ~/ Z( H, F; _  12 }
% {# i2 f( B" V. T( _; `& w  13
, Q4 X3 N1 r3 a
% l/ W& n& L# p, j6 H/ n  14 private:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:57:02 | 显示全部楼层

2012年计算机等级考试二级C++辅导讲义(8)

</p>  15 T& ref_;
: b7 q4 A0 H/ g& l  16 };
, B1 G4 }3 Y. E. U; @  17
; e8 v% q: j  V2 D: f% E' E8 ^  18
3 H3 B" x( u; v  g2 S  19 template
. ~- P5 D% [& y4 U+ f! T+ L  20 inline RefHolder ByRef(T& t) {
( z% L  F4 |1 B4 p) c  21 return RefHolder(t);
$ G: ~% o$ W5 L* Y! R  22 }
+ ^" u. Q% ]6 j) J7 G) R( x  23
* w) n* \. S3 L. q( n  s. J% `  24 int inc(int& num) {
5 P( w2 q6 Z: p8 [) N  25 num++;
9 }& S# K" K5 m# y7 \  26 return num;
9 `& @8 w7 x+ S: {  27 }* x9 G6 B# `- G+ s; _- o
  28
# \: Y$ T0 X/ f4 D( a. G3 ^  29
; B4 b5 x! n1 U' j  30 int main() {
( B: X3 N  j: }9 z5 i' P, _  31 int n = 1;$ T6 E7 e: D4 P. R% T

) x( N* n  c! V4 [; C8 w% C, Y  32 std::cout
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 19:13 , Processed in 0.297008 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表