第29课 类中的函数重载

1. 函数重载的回顾

(1)函数重载本质相互独立的不同函数

(2)C++中通过函数名函数参数确定函数调用函数名参数列表组成唯一的标识

(3)无法直接通过函数名得到重载函数的入口地址

(4)函数重载必然发生在同一个作用域中

 

【编程实验】类成员函数指针

#include <iostream>

using namespace std;

 

class Test
{

public:

   void show()
   {

       cout <<"Test::show()" << endl;

   }

  

   void print()
   {

       cout <<"Test::print()" << endl;

   }

};

 

//声明类成员函数指针
typedef void (Test::* PFunc)();

 

int main()
{

   Test t;

   PFunc p = t.show;

   (t.*p)();  //Test::show()

  

   p = t.print;

   (t.*p)(); //Test::print()

}

运行结果:

  

 

2. 类中的函数重载

——类中成员函数可以进行重载

  • 构造函数重载

  • 普通成员函数重载

  • 静态成员函数重载

 

【实例分析】全局函数普通成员函数以及静态成员函数之间是否可以构成重载   29-1.cpp

#include <stdio.h>

 

class Test
{

private:

    int i;

 

public:
   // 构造函数 Test() { printf(
"Test::Test()\n"); this->i = 0; } Test(int i) { printf("Test::Test(int i)\n"); this->i = i; } Test(const Test& obj) { printf("Test::Test(const Test& obj)\n"); this->i = obj.i; }    // 静态成员函数 static void func() { printf("Test::func()\n"); }    // 普通成员函数 void func(int i) { printf("Test::func(int i), i = %d\n",i); } int getI(){return i;} }; //全局函数 void func() { printf("::func()\n"); } void func(int i) { printf("::func(int i), i = %d\n",i); } int main() { //全局函数func和func(1)构成重载关系 func(); //::func() func(1); //::func(int i) printf("\n"); //构造函数之间构成重载关系 Test t; //Test::Test() Test t1(1); //Test::Test(int i) Test t2(t1);//Test::Test(const Test& obj) printf("\n"); //全局函数与静态成员函数不构成重载(作用域不同 func(); //::func() Test::func(); //Test::func() printf("\n"); //全局函数与类的普通成员函数也不构成重载(作用域不同 func(2); //::func() t1.func(2); //Test::func(int i) printf("\n"); //类中普通成员与静态成员构成重载关系(作用域相同,且符合重载条件 t1.func(); //Test::func() t1.func(3); //Test::func(int i) return 0; }

运行结果:

  

 

3. 重载的深度意义

(1)通过函数名函数功能进行提示

(2)通过参数列表函数用法进行提示

(3)扩展系统中已经存在的函数功能

(4)扩展其他更多的功能

 

【编程实验】重载的意义分析   29-2.cpp

#include <stdio.h>

#include <string.h>

 

//重载strcpy函数,进行功能的扩展
char* strcpy(char* buf, const char* str, unsigned int n)

{

    return strncpy(buf, str, n);

}

 

int main()
{

    const char* s = "Hello World!";

    char buf[8] = {0};

   

    //strcpy(buf, s); //原来strcpy函数,会出现缓冲区溢出

    strcpy(buf, s, sizeof(buf)-1);//重载的函数,比较安全

   

    printf("%s\n", buf);

    return 0;

}

运行结果:

  

 

4. 小结

(1)类的成员函数之间可以重载

(2)重载必须发生同一个作用域中全局函数成员函数不能构成重载关系

(3)重载意义在于扩展已经存在的功能

posted @ 2018-12-09 17:38  梦心之魂  阅读(163)  评论(0编辑  收藏  举报