你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C++——类成员函数重载

[复制链接]
gaosmile 发布时间:2020-8-12 20:55
一、类中的函数重载:+ [& Q$ [# o: a) v  O% {0 T0 A! t
1、函数重载的温习:
  • 函数重载的本质为相互独立的不同函数
  • C++中通过函数名和函数参数确定函数调用
  • 无法直接通过函数名得到函数重载函数的入口地址
  • 函数重载必然发生在同一个作用域中

    . m$ e/ x; V; H9 P+ g
2、类中的成员函数可以进行重载:
  • 构造函数的重载
  • 普通成员函数的重载
  • 静态成员函数的重载

    # P1 n% j2 K) l* t
这里有一个问题:全局函数,普通成员函数以及静态成员函数之间是否可以构成重载?
从上面回顾重载函数的知识中,我们要注意到一点函数重载必须发生在同一作用域里面(其他两点问题不大),所以的构造函数和普通成员函数是可以构造重载的,而与全局函数是不可以构成重载的。
代码测试:
#include <stdio.h>
* D0 y8 R1 E- N* |( f9 v
# ?* b) l7 L3 C; zclass Test
9 U: M+ f2 q( U# ~{
0 Y. V6 e6 K' g/ Z% G7 }1 w    int i;
# ^; e4 g. d: y5 Rpublic:
& e8 l8 a1 ~3 I. a1 \    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)
9 V% B( m7 S& a' U5 p    {5 G) W9 d6 X3 M. p3 G/ v% p
        printf("Test::Test(int i)\n");
) J9 D7 v0 j! Q, E: H- Y3 n7 Q* u7 m& j        this->i = i;/ \0 C5 _# v1 Q! j) J
    }+ `- q* T6 H+ |% v+ [
   
% m5 ^; g1 g# }! {" S    Test(const Test& obj)
3 q: y+ _; q5 J9 A1 J    {
6 G& V! M- ^$ u5 f0 u% l5 m        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
    }
7 o. g8 ~6 |; k   
! u% e( Q8 T. T$ {$ d% x+ f    static void func()7 M+ \8 d3 j# f4 Q$ ]- V4 O: l. w& {/ h
    {
8 u2 C- C( G# J9 i        printf("void Test::func()\n");
  Q8 z" H  N, ?  ^  H    }. y; }9 e% i7 i$ r
   
. n+ v; Q8 R7 n, T9 L    void func(int i)
7 k$ Z2 t/ f$ E  f2 O; H; }    {! |" 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
   
. u- n4 }+ W7 Y: q  ~    int getI()
: p  p/ e/ F& j4 o6 A    {5 T9 o6 p# _2 X6 I' E) f
        return i;
& p0 p- }& a1 a: E    }
% Y* z' x' K, X2 Z0 Q};
4 e- Y  y( {! F) |: ~, z" t. B
! b+ y4 F# p( i, ?; w; M: }% Cvoid func()# {+ _! N5 [) c3 F
{& a8 ~: b5 {: k) v  |; C" x
    printf("void func()\n");
- e! C+ W0 ?: q# U}) r, C* w4 Q2 a$ `
& s6 C- E: w6 F; V& C4 H9 f
void func(int i)
3 {$ V0 ?  {, {+ z6 A{, 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();
' d) _/ h; [4 ~, t; V+ Z: G    func(1);; J* q7 m' o# \
    , [5 e: B9 P7 p
    Test t;        // Test::Test()
2 u; w: |: S' e/ T( k3 |% F    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;
! e$ v- [' d5 |9 U    t1.func(2);    // void Test::func(int i), i = 2: C- J* a. O$ B/ j% h3 ]
    t1.func();     // void Test::func()
$ V) e/ Y9 E" g( M1 v    , I6 [; ]+ v+ D4 {0 p% B, ^
    return 0;+ i, y8 o' X! X4 `. L" ]
}
) @- `' [! s- {2 J, ?

+ q1 Y2 T. T/ F5 [7 L" E9 M8 c
输出结果:
root@txp-virtual-machine:/home/txp# ./a.out6 x/ a( E7 C! Q" p
void 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)
2 }5 W  d! g4 L# G3 ~* }. LTest::Test(const Test& obj
: e3 F8 f* W1 `* B/ R* b: Mvoid func()
0 p/ e5 H7 i/ @2 n+ v3 yvoid Test::func()
! n; F; x& X) f0 U! {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、重载的意义:
  • 通过函数名对函数功能进行提提示
  • 通过参数列表对函数用法进行提示
  • 扩展系统中已经存在的函数功能

    , U3 W  p. ]& D
这里用c语言里面的拷贝字符串函数strcpy来进行扩展演示:
代码版本一:
#include <stdio.h>
2 u0 z& D2 v0 l# L& j  c. g& L#include <string.h>
; D$ J7 Y& h- B2 ^2 }2 Y% p
8 {7 M$ l! U# `8 v, A- X6 aint main()
& ~2 `" K; n3 A9 F9 r{) m. g& \" |6 b* B# s7 s  N
    const char* s = "linux is great !";
/ j3 ?) l0 h; j1 w' J- K8 j    char buf[8] = {0};
7 F. Q; U' m; e   
/ c  ]2 M5 `; v* {    strcpy(buf, s);2 m2 e( j4 v  I: ?; d
    * K4 @% ~6 V9 k% k5 H
   
+ ~; j/ t! Y. h0 m    printf("%s\n", buf);
1 u. ~+ @- a4 w$ _; k) P    7 g) @" S( y/ t8 X4 E
    return 0;! w1 q' o) v' i5 f' O
}0 S) r& v3 z8 c) K; x

5 l) J$ ~% i+ X6 o  y
输出结果:
root@txp-virtual-machine:/home/txp# ./a.out
0 n' Z" r3 O# J' o) i$ M6 blinux is great !2 \5 T/ j1 v6 I0 _0 U5 J
*** stack smashing detected ***: ./a.out terminated
7 \. Q1 Z" b4 L+ q0 K1 ~1 xAborted (core dumped)
; X, v( m2 @( F8 _9 p4 |6 q, _
) C) L8 T4 I. d4 C
这里虽然结果是输出多了,但是这个程序同时也报了段错误,因为buf所能存储的能力小于s;所以为了解决这个问题,你肯定第一时间想到strncpy函数:
代码版本二:
#include <stdio.h>
2 X* e0 S' ]; O8 w8 A' H4 [#include <string.h>
5 W  h% ^( Q3 ?; k
' Z$ ]8 e8 f& c+ x$ Wint main()1 b& ~. z& `  {/ X6 L
{' [  `) T. K  _( i5 ~
    const char* s = "linux is great !";
  s5 M  y  p" b# H    char buf[8] = {0};
' z5 M' U; m0 E4 F2 l( A8 C    ' P/ I# k1 ]! W' y
    strncpy(buf, s,sizeof(buf)-1);
8 }4 y0 @+ {* q, y( i   
) N" r3 ]( p1 r% M   
. H/ Y9 @3 s* {    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
}

# |* f2 a% \+ J
输出结果:
root@txp-virtual-machine:/home/txp# ./a.out
& v6 k3 A# \; \3 H( qlinux i
  V& B8 r+ K. m, p2 d" H( i3 R6 X

& J+ p! A- b6 L/ S2 h8 A/ o0 I
这个函数就保护程序的安全性;但是我在c++里面既然学习了函数重载,那么久可以在原有的函数基础上进行扩展:
代码版本三:
#include <stdio.h>+ r( l. y, T8 B2 `* i' |- @
#include <string.h>: H/ k' u8 p6 y1 A

3 H9 l' s6 F: L  f$ hchar* strcpy(char* buf, const char* str, unsigned int n)- p( s# J4 b4 w4 z/ U
{
' l$ d! p6 G( @% x    return strncpy(buf, str, n);
9 A4 M3 F& J9 Y  i& A# u2 `}
& K1 q3 f! }' Q2 k0 V; c
6 O$ O+ l" E6 A  m& B; ?% pint 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 ]
   
2 C. _7 L4 T+ \6 A    strcpy(buf, s, sizeof(buf)-1);
& A$ S. h" E8 ^3 }- U   
& ]: @# J4 ~" w7 {5 R    printf("%s\n", buf);
9 R& z. d( D* K4 s8 F1 m& B) O$ c    9 X  w4 {( c8 u9 n" a' J1 h2 S
    return 0;; c: x8 O6 r/ w, D1 R2 C' @5 y
}
( x( Y$ b7 W8 C6 H6 s, g+ z8 K

$ J: @: R; h3 @
输出结果:
root@txp-virtual-machine:/home/txp# ./a.out
: i( M( R7 M/ @$ T* s7 Xlinux i
% I# k: M- q; o8 y: O
0 W, I8 \( n: P  r3 ?
二、总结:
  • 类的成员函数之间可以进行重载
  • 重载必须发生在同一个作用域中
  • 全局函数和成员函数不能构成重载关系
  • 重载的意义在于扩展已经存在的功能

    4 Y, m1 M( m- e
; I( g# @# U( f5 ~% Z/ R1 R9 ~7 ~
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。

4 p. p9 a5 d8 a/ j
赞 收藏 评论0 发布时间:2020-8-12 20:55

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版