在实际开发中,有时候咱们须要实现几个功能相似的函数,例如把变量的值写入文件,变量的类型多是int、long、double、char,经过参数把变量传入函数。在C语言中不容许函数同名,程序员只能设计出四个不一样名的函数,其函数声明以下:程序员
bool writetofile_int(char *filename,int value); // 写入int bool writetofile_long(char *filename,long value); // 写入long bool writetofile_double(char *filename,double value); // 写入double bool writetofile_char(char *filename,char *value); // 写入char字符串
C语言中函数命名不能重复对程序员是一种负担,编程序的时候须要想象出相近的函数名,调用函数的时候,书写函数名也是一件麻烦的事情。编程
C++容许多个函数拥有相同的名字,只要它们的参数列表不一样就能够,这就是函数的重载(Function Overloading),借助重载,多个功能相近的一系列函数可使用同一函数名。ide
函数的参数列表包括参数的类型、参数的个数和参数的顺序,只要有一个不一样就叫作参数列表不一样。函数
使用C++函数重载,把变量的值写入文件的函数声明修改以下:学习
bool writetofile(char *filename,int value); // 写入int bool writetofile(char *filename,long value); // 写入long bool writetofile(char *filename,double value); // 写入double bool writetofile(char *filename,char *value); // 写入char字符串
重载就是在一个做用范围内(同一个程序、同一个类、同一个命名空间等)有多个名称相同但参数列表不一样的一系列函数。测试
在使用重载函数时,同名函数的功能应当类似,不要用相同名称的函数名去实现不相干的功能,虽然程序也能运行,但可读性很差,令人以为莫名其妙。.net
注意,参数列表不一样包括参数的个数不一样、类型不一样或顺序不一样,仅仅参数名称不一样是不能够的,函数返回值也不能做为重载的依据。设计
编译器在编译C++程序时会根据参数列表对函数进行重命名,例如:3d
bool writetofile(char *filename,int value);
重命名为code
bool _writetofile_char_int(char *filename,int value);
bool writetofile(char *filename,long value);
重命名为
bool _writetofile_char_long(char *filename,long value);
程序被编译时,编译器会根据参数列表逐个匹配,选择对应的函数,若是匹配失败,编译器就会报错,这叫作重载决议(Overload Resolution)。
因此,函数重载仅仅是语法层面的,本质上它们仍是不一样的函数,占用不一样的内存,入口地址也不同。
咱们在介绍C语言字符串的时候,学习了strcpy函数。
char *strcpy(char *dest, const char *src);
strcpy函数有两个缺陷:1)没有对dest变量进行初始化;2)若是src的长度超过dest,会形成内存溢出。
咱们如今来重写strcpy函数,弥补这两个缺陷,新函数名仍是采用strcpy命名,但参数列表不一样,声明以下:
char *strcpy(char *dest, const char *src,size_t destsize);
dest和src参数的含义与库函数strcpy相同,第三个参数destsize是dest占用内存的大小。
示例(book201.cpp)
/* * 程序名:book201.cpp,此程序用于演示C++函数重载,修复strcpy函数的缺陷 * 做者:C语言技术网(www.freecplus.net) 日期:20190525 */ #include <stdio.h> #include <string.h> // 重载strcpy函数,对dest初始化,防止内存溢出。 char *strcpy(char *dest, const char *src,size_t destsize); int main() { char dest[10]; strcpy(dest,"www.freecplus.net",sizeof(dest)); // 新strcpy printf("=%s=\n",dest); strcpy(dest,"www.freecplus.net"); // 旧strcpy printf("=%s=\n",dest); } // 重载strcpy函数,对dest初始化,防止内存溢出 char *strcpy(char *dest, const char *src,size_t destsize) { memset(dest,0,destsize); // 对dest初始化 // 计算须要复制的字符数,不能超出destsize-1 size_t len=0; if (strlen(src)<=destsize-1) len=strlen(src); else len=destsize-1; strncpy(dest,src,len); // 复制字符串,超出的将扔掉 dest[len]=0; // 强制字符串的结尾标志 return dest; }
运行效果
C语言提供了一些库函数,这些库函数的功能确定不能知足实际开发的需求,须要程序员从新扩展加固,这是优秀程序员与普通程序员的差异。
1)编写示例程序,把本章节介绍的知识点所有演示一遍,用程序演示能够加深您的理解和映象。
2)编写示例程序,测试函数的返回值不一样可否做为函数重载的依据。
3)编写示例程序,测试函数的参数名不一样可否做为函数重载的依据。
C语言技术网原创文章,转载请说明文章的来源、做者和原文的连接。
来源:C语言技术网(www.freecplus.net)
做者:码农有道
若是这篇文章对您有帮助,请点赞支持,或在您的博客中转发个人文章,谢谢!!!若是文章有错别字,或者内容有错误,或其余的建议和意见,请您留言指正,很是感谢!!!