函数重载的回顾(接上一篇文章):
- 函数重载的本质为相互独立的不同的函数
 - C++中通过函数名和函数参数确定函数调用
 - 无法直接通过函数名得到重载函数的入口地址
 - 函数重载必然发生在同一个作用域中
 
类中的成员函数可以进行重载
- 构造函数的重载
 - 普通成员函数的重载
 - 静态成员函数的重载
 
问题:全局函数,普通成员函数以及静态成员函数之间是否可以构成重载?
 下面分析代码:
#include <stdio.h>class Test
{int i;
public:Test(){printf("Test::Test()\n");this->i = 0;}Test(int i){printf("Test::Test(int i),i=%d\n",i);this->i = i;}Test(const Test& obj){printf("Test(const Test& obj)\n");this->i = obj.i;}static void func(){printf("void Test::func()\n");}void func(int i){printf("void Test::func(int i),i = %d\n",i);}int getI(){return 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 t;        //Test::Test()Test t1(1);    //Test::Test(int i)Test t2(t1);   //Test(const Test& obj)func();        //void func()Test::func();  //void Test::func()func(2);       //void func(int i),i = 2;t1.func(2);    //void Test::func(int i),i = 2;t1.func();     //void Test::func()return 0;
}
 
打印结果为:
void func()
void func(int i),i = 1
Test::Test()
Test::Test(int i),i=1
Test(const Test& obj)
void func()
void Test::func()
void func(int i),i = 2
void Test::func(int i),i = 2
void Test::func()
 
由打印结果我们知道;
1.重载函数的本质为多个不同的函数
 2.函数名和参数列表是唯一的标识
 3.函数重载必须发生在同一个作用域中
重载的深度意义:
- 通过函数名对函数功能进行提示
 - 通过参数列表对函数用法进行提示
 - 扩展系统中已经存在的函数的功能
 
下面分析代码让我们更加深层次的了解函数重载的意义:
#include <stdio.h>
#include <string.h>int main()
{const char* s = "Liuyangyang";char buf[16] = {0};strcpy(buf,s);printf("%s\n",buf);return 0;
}
 
打印为:
Liuyangyang
 
上面这段代码很简单,就是一个拷贝字符串到一个数组中的程序,看起来很简单,但是在现在的软件工程中,这么做还是很容易出错的,因为当定义的buf大小如果不够的话,就会出现内存泄露的情况,所以我们需要对其进行修改。
#include <stdio.h>
#include <string.h>char* strcpy(char* buf,const char* str,unsigned int n)
{return strncpy(buf,str,n);
}int main()
{const char* s = "Liuyangyang";char buf[8] = {0};//strcpy(buf,s);strcpy(buf,s,sizeof(buf)-1);printf("%s\n",buf);return 0;
}
 
打印结果为:
上面修改后的代码,将strcpy函数进行重载,加入了一个参数,里面返回的strncpy是C语言中的库函数,有人会问为什么我们不直接用这个库函数呢,因为,人们习惯了strcpy,况且strncpy也不是很好记!
总结:
- 类的成员函数之间可以进行重载
 - 重载必须发生在同一个作用域中
 - 全局函数和成员函数之间不能构成重载关系
 - 重载的意义在于扩展已经存在的功能
 
想获得各种学习资源以及交流学习的加我(有我博客中写的代码的原稿):
 qq:1126137994
 微信:liu1126137994
 可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。