本文内容来自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结
函数重载回顾
- 函数重载的 本质为相互独立的不同函数
- C++ 中通过 函数名 和 函数参数 确定函数调用
- 无法 直接通过 函数名 得到重载函数的 入口地址
- 函数重载 必然发生在同一个作用域中
类中的成员函数可以进行 重载
构造函数的重载
普通成员函数的重载
静态成员函数的重载
编程实验
我们编写一个代码,分别来完成构造函数的重载,普通成员函数的重载,静态成员函数的重载
#include <stdio.h>
class Test
{
private:
int m_i;
public:
Test();
Test(int i);
static void func();
void func(int i);
Test(const Test& t);
};
Test::Test()
{
printf("Test()\n");
}
Test::Test(int i)
{
m_i = i;
printf("Test(int i), m_i = %d\n", m_i);
}
void Test::func()
{
printf("func()\n");
}
void Test::func(int i)
{
printf("func(int i), i = %d\n", i);
}
void func()
{
printf("void func()\n");
}
void func(int i)
{
printf("void func(int i), i = %d\n", i);
}
int main()
{
func();
func(1);
Test t1;
Test t2(1);
Test::func();
t1.func(1);
t2.func(2);
return 0;
}
运行结果
重载的意义
通过 函数名 对函数 功能进行提示
通过 参数列表 对函数 用法进行提示
扩展 系统中 已经存在 的函数功能
实验编程
目的:说明函数重载的意义
我们在使用strcpy的过程中,由于被赋值的缓存大小不够导致溢出,为了解决这个问题,我们将 strcpy 函数进行重载
#include <stdio.h>
#include <string.h>
void strcpy(char *buff, const char *str, unsigned int n)
{
strncpy(buff, str, n);
}
int main()
{
const char* str = "hello world!";
char tmp[4] = {0};
strcpy(tmp, str, sizeof(tmp)-1);
printf("buff = %s\n", tmp);
return 0;
}
运行结果
程序中对 strcpy 函数进行了重载,增加了一个buff长度参数,内部调用 strncpy ,保证了 strcpy 时不会造成溢出
小结
- 类的 成员函数 之间可以进行 重载
- 重载必须 发生不同一个作用域中
- 全局函数 和成员函数 不能 构成重载关系
- 重载的意义在于 扩展已经存在的功能