|
一、类中的函数重载:+ [& Q$ [# o: a) v O% {0 T0 A! t 1、函数重载的温习:
2、类中的成员函数可以进行重载:
这里有一个问题:全局函数,普通成员函数以及静态成员函数之间是否可以构成重载? 从上面回顾重载函数的知识中,我们要注意到一点函数重载必须发生在同一作用域里面(其他两点问题不大),所以的构造函数和普通成员函数是可以构造重载的,而与全局函数是不可以构成重载的。 代码测试: #include <stdio.h>class Test { int i; public: Test(); M* e2 k7 A! Q6 A7 ?8 r9 x {& A& E2 r) I+ K0 z' B4 w5 [3 ? printf("Test::Test()\n");/ K; Q0 `4 N( r! t9 U h* G9 t this->i = 0;3 v0 M9 o# b" ], K# K }8 m. m- ]% d) N5 m% M" \ " `, Z8 z7 K- L" @, s Test(int i) {5 G) W9 d6 X3 M. p3 G/ v% p printf("Test::Test(int i)\n"); this->i = i;/ \0 C5 _# v1 Q! j) J }+ `- q* T6 H+ |% v+ [ Test(const Test& obj) { printf("Test(const Test& obj)\n");: r3 ~4 i1 ?- M/ c) U1 N" N# A5 g this->i = obj.i; \" q* Q$ ?1 b& E0 F } static void func()7 M+ \8 d3 j# f4 Q$ ]- V4 O: l. w& {/ h { printf("void Test::func()\n"); }. y; }9 e% i7 i$ r void func(int i) {! |" A( T* H$ ]8 w. j2 Z8 f+ m8 @1 m# ~ printf("void Test::func(int i), i = %d\n", i);% K/ B2 t Q( d( ^" D' j% V }- O! D0 ^, b7 a+ Y int getI() {5 T9 o6 p# _2 X6 I' E) f return i; } }; void func()# {+ _! N5 [) c3 F {& a8 ~: b5 {: k) v |; C" x printf("void func()\n"); }) r, C* w4 Q2 a$ ` & s6 C- E: w6 F; V& C4 H9 f void func(int i) {, t1 x& M0 d# A" @+ U; U( h printf("void func(int i), i = %d\n", i);+ e& v o+ o2 h, T5 h }9 K, M+ a# @8 P3 u" r+ V5 W9 T% G ) _+ A/ d. G! t% B3 |% E int main()) x1 c0 }% T( E' M( y {, q' q: ]+ B% ?" P: Y9 Q func(); func(1);; J* q7 m' o# \ , [5 e: B9 P7 p Test t; // Test::Test() Test t1(1); // Test::Test(int i)0 l9 |' }! g' T Test t2(t1); // Test(const Test& obj)7 c- {# s0 S6 K, y9 t: Q & D7 j# h5 E$ Z! ^ func(); // void func()3 |# U. ]: i! o' u( y Test::func(); // void Test::func()+ G6 `, y5 ]) }0 m E $ r+ i% Y! _% E/ A. I/ A func(2); // void func(int i), i = 2; t1.func(2); // void Test::func(int i), i = 2: C- J* a. O$ B/ j% h3 ] t1.func(); // void Test::func() , I6 [; ]+ v+ D4 {0 p% B, ^ return 0;+ i, y8 o' X! X4 `. L" ] } 输出结果: root@txp-virtual-machine:/home/txp# ./a.out6 x/ a( E7 C! Q" pvoid func()" Q# c, Z0 I' y; ` void func(int i),i=1% ^$ x3 L' A U' U Test::Test()4 ^ n7 w H# d3 ]. T Test::Test(int i) Test::Test(const Test& obj void func() void Test::func() void func(int i),i=2$ L5 p/ D r; z' u9 p void Test::func(int i), i =2$ B- S3 F# w1 Z" | void Test::func()( \8 j% M' g& l' f2 [ Y& r - z* ?+ d" |2 ^# h9 m4 K8 @ 3、重载的意义:
这里用c语言里面的拷贝字符串函数strcpy来进行扩展演示: 代码版本一: #include <stdio.h>#include <string.h> int main() {) m. g& \" |6 b* B# s7 s N const char* s = "linux is great !"; char buf[8] = {0}; strcpy(buf, s);2 m2 e( j4 v I: ?; d * K4 @% ~6 V9 k% k5 H printf("%s\n", buf); 7 g) @" S( y/ t8 X4 E return 0;! w1 q' o) v' i5 f' O }0 S) r& v3 z8 c) K; x 输出结果: root@txp-virtual-machine:/home/txp# ./a.outlinux is great !2 \5 T/ j1 v6 I0 _0 U5 J *** stack smashing detected ***: ./a.out terminated Aborted (core dumped) ) C) L8 T4 I. d4 C 这里虽然结果是输出多了,但是这个程序同时也报了段错误,因为buf所能存储的能力小于s;所以为了解决这个问题,你肯定第一时间想到strncpy函数: 代码版本二: #include <stdio.h>#include <string.h> int main()1 b& ~. z& ` {/ X6 L {' [ `) T. K _( i5 ~ const char* s = "linux is great !"; char buf[8] = {0}; ' P/ I# k1 ]! W' y strncpy(buf, s,sizeof(buf)-1); printf("%s\n", buf);$ w' C! A( M$ c4 K7 e p) M , w9 f4 U- {& f$ A9 D1 X return 0;. m7 L+ r& M( y& I# s } 输出结果: root@txp-virtual-machine:/home/txp# ./a.outlinux i 这个函数就保护程序的安全性;但是我在c++里面既然学习了函数重载,那么久可以在原有的函数基础上进行扩展: 代码版本三: #include <stdio.h>+ r( l. y, T8 B2 `* i' |- @#include <string.h>: H/ k' u8 p6 y1 A char* strcpy(char* buf, const char* str, unsigned int n)- p( s# J4 b4 w4 z/ U { return strncpy(buf, str, n); } int main()! U; C( Z* x5 N! S7 `7 } {7 G' b, _( q+ z0 O8 C3 l" Z" ^ const char* s = "linux is great !";" D! R' c2 X" Z8 p. P2 {2 S char buf[8] = {0};% A7 \! I. r, _3 ] strcpy(buf, s, sizeof(buf)-1); printf("%s\n", buf); 9 X w4 {( c8 u9 n" a' J1 h2 S return 0;; c: x8 O6 r/ w, D1 R2 C' @5 y } 输出结果: root@txp-virtual-machine:/home/txp# ./a.outlinux i 0 W, I8 \( n: P r3 ? 二、总结:
; I( g# @# U( f5 ~% Z/ R1 R9 ~7 ~ 好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。 |
微信公众号
手机版