|
一、操作符重载: 1、我们先来看一个问题实现,下面的复数解决方案是否可行,复数大家应该都不陌生(分为实部和虚部): class Complex{ public:2 w* J. }, a }/ x' s. l$ [ int a;4 x) i" B, J' f# [6 u& K int b;$ F9 I. t4 Q+ b) C, a };0 p7 b' b7 M. }8 E3 P /*--------------------------*/; t# W# _% d+ ^3 X s' M int main(). |; I' k4 d) K8 B" H {$ x, j! m: Q5 N3 n$ u1 @) d$ M Complex c1 = {1,2}; Complex c2 = {3,4}; Complex c3 = c1 + c2;//也就是复数的实部加实部,虚部叫虚部。0 r/ g5 c1 ~) H* W5 n6 _) ]/ ^ return 0; } h; H& t) U) O 注:成员变量为公有且没有自定义构造函数的时候,可以通过大括号来分别初始 化成员变量; 5 X4 P; k& p" l# L' d$ q 代码版本一: #include <stdio.h>' j. `- v8 O8 t9 V8 C: z( q* e! p; i/ g/ `6 R class Complex { int a;# ?% u5 c4 W3 ?/ h& B4 W int b; public:7 z3 p$ h2 x, w: ~ Complex(int a = 0, int b = 0)' o# C& D/ e! K! M; X { this->a = a; this->b = b;6 y: G& f! V6 t6 L! O) } }7 d5 T& b. J1 m/ q( k/ j int getA() {/ I( N+ D" S7 `0 Q return a;& M2 D) b* c- N7 `- i- i }3 q! M2 N7 p' f5 ]6 \( J$ h int getB(): k+ |+ Q, m5 h% m; K. Q7 w { `6 ?1 O; u- P; X return b;9 G2 h) U: a, c0 V- y" m }8 L/ u$ z; O' _& J9 F; U8 y3 A7 y7 p 1 v3 I: }/ R( R7 @! @3 S( o friend Complex Add(const Complex& p1, const Complex& p2);# u, M O: f" B# \ }; Complex Add(const Complex& p1, const Complex& p2)# u1 {5 h) u2 Y' B+ f1 q { Complex ret; , J0 ?3 G1 D% `) ^$ i" O" K ret.a = p1.a + p2.a;$ l5 w' |3 i% Z; A+ m ret.b = p1.b + p2.b; # w' G ]$ n j return ret; } int main() {8 `$ n h9 e& M; [ . ~. D" k% d* Z1 q0 ?: R Complex c1(1, 2);$ T/ }9 l- n. T" W) A" [4 z Complex c2(3, 4);$ M2 k) Y. C3 A L, @8 K* Z$ I' Q Complex c3 = Add(c1, c2); // c1 + c2 printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB()); return 0;. J9 T- i5 U# q+ Q2 |! N* F } & y" F) m% _- P; Z" b# N( {+ R 运行结果: root@txp-virtual-machine:/home/txp# ./a.out( \* {: w: \2 C1 I2 s* @7 V% V2 Tc3.a=4,c3,b=6 这里通过Add函数可以解决Complex对象相加的问题,但是在我们数学运算里面就是直接实部加实部,虚部加虚部,和正常的实数相加一样,所以说,为什么不直接这样操作呢,这就涉及到符号"+"的问题。 2、操作重载符的引出
3、操作重载符的语法:
{ Type ret; . l7 W+ u8 b0 Y: x' d return ret; }' A8 q3 Z' R3 K- b/ \ 注:Sign为系统中预定义的操作符,比如:+、-、*、/ 等1 \ q2 W7 m' x9 ^ 代码版本二: #include <stdio.h>$ g; \( ~8 X" B, [# Qclass Complex 0 B3 s2 w) U s; H6 l {" U+ J/ _$ c) } int a;4 }0 _2 j: f6 V& ] int b; public: Complex(int a = 0, int b = 0)0 D/ f C" f4 e: R$ o8 ~ { this->a = a; this->b = b;* h `$ q9 Z* u: j8 f }9 ^; D. Y9 W0 c- R5 n int getA() {' a$ l6 ?: U& p- _3 ? return a;# j$ p, \5 ~( t9 h! X }# n- Q4 A' v' I$ e int getB(); E; c( E/ m, b& a R0 T {2 P- Z/ A- o& P return b;5 N6 z" _. o, w* q, I9 e } + N$ I& }2 P& n O/ W6 w friend Complex operator + (const Complex& p1, const Complex& p2); }; , J) Y2 N9 E1 A* f" c Complex operator + (const Complex& p1, const Complex& p2) {& q/ W( ]' Q( a& E Complex ret; ret.a = p1.a + p2.a; ret.b = p1.b + p2.b; * Q' w4 W8 A2 n. a return ret; } int main()4 P. r5 ~6 m* ~) p {6 g1 q3 h' }, p/ v4 p a 5 ^4 w0 {. I: H, a8 c: b2 Z. u Complex c1(1, 2);- I2 q: X' _: R! j6 Q: W& ] Complex c2(3, 4); Complex c3 = c1 + c2; // operator + (c1, c2) ; ], p. ^6 S4 ^& C9 |) U printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB()); return 0;/ ?" A' I/ s; r, T' |$ E" E$ g* m }" ?. \/ O' |" ~# F) }6 p/ ?1 k9 j0 b" \ 输出结果: root@txp-virtual-machine:/home/txp# ./a.outc3.a=4,c3,b=6 4、再次改进代码:
{: V1 o% A F; c& X+ S7 ^# g public:! P. j% z) U0 ?+ i g Type operator Sign(const Type& p)# b4 S: J. {3 U8 U5 U# u2 `7 _: _ { Type ret;! N% F0 {' q% ?) g( s$ e return ret; } };* i. N5 M% Y! g ]0 {/ c0 b. @" K 代码版本三: #include <stdio.h>class Complex 0 r0 A) w: b; _' D& C { int a;4 c* Z2 u" Q3 @ W1 O! { int b;5 ]' i K+ I J% O public:/ n# H5 f/ _7 x Complex(int a = 0, int b = 0) { this->a = a;, z; H% ?6 ?* u* g! J8 X2 c. D) v this->b = b;( b( [3 b% V: H r$ g- M* p }( J+ M( |6 b, y2 t ( H9 t- T: L- w" W& \ int getA(), g Z" U: b h) z6 n {) P! ^! M( ]2 \ B8 P return a;: u; I9 s# p# [0 A+ C% f) @ }$ v! [, M& k# g6 |+ ^& S . s" {1 f: C9 d# y# Y int getB()* Y- \$ r/ X) x: r { return b;$ y2 }0 L( Y, D! ^1 J } 8 S# B6 ^7 D/ B/ u: l Complex operator + (const Complex& p)/ G9 X( G# @! p: w1 P# D6 ~+ { {: b/ u# w' p0 O* r- f Complex ret;9 O3 b0 x1 ~% w- w* z+ }2 I. H' V printf("Complex operator + (const Complex& p)\n"); ret.a = this->a + p.a; ret.b = this->b + p.b; 6 `7 a8 N* C( o return ret; } friend Complex operator + (const Complex& p1, const Complex& p2);7 v3 k( p. n8 Y }; Complex operator + (const Complex& p1, const Complex& p2) { Complex ret;. |8 n- f' y% c: h% r printf("Complex operator + (const Complex& p1, const Complex& p2)\n"); ret.a = p1.a + p2.a; ret.b = p1.b + p2.b; & K9 `3 v C- W( t3 I return ret;* k( D! |8 |' P } ; J' ]" }/ }, \) `8 q int main() {7 e0 V0 X4 j. X5 n! ^4 P, \* A& Z ' h/ E6 [5 N3 Y* ? Complex c1(1, 2);& V! ]) { c9 H Complex c2(3, 4);6 U) g& |4 V2 R2 D, A$ s Complex c3 = c1 + c2; // c1.operator + (c2) . ^7 Y; I" g- r# W printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB()); ( v. ^& k7 C3 a& d" x) W return 0;6 q* U6 Y5 b. y5 b. U2 n. H$ x } 输出结果: root@txp-virtual-machine:/home/txp# ./a.out# B5 \, |" Y3 n% A6 l0 x2 H; N* `Complex operator +(const Complex& p)- L. O) N& Q6 s# V c3.a=4,c3,b=6/ \; N3 k9 f) s$ [3 }5 G 二、总结:
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。 |
微信公众号
手机版