第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)重载的意义在于扩展已经存在的功能