类中的函数重载(二十三)
今天我们来讲讲函数重载。函数重载的本质为相互独立的不同函数,在 C++ 中通过函数名和函数参数确定函数调用。是无法直接通过函数名得到重载函数的入口地址的,函数重载也必然发生在同一个作用域中。类中的成员函数也是可以进行重载的:构造函数的重载,普通成员函数的重载以及静态成员函数的重载。那么全局函数,普通成员函数以及静态成员函数之间可以构成重载吗?重载函数的本质为多个不同的函数,函数名和参数列表是唯一的标识,函数重载必须发生在同一个作用域中。
下来我们以代码为例进行分许,来回答上面提出的问题
#include<stdio.h>classTest{inti;public:Test(){printf("Test::Test()\n");this->i=0;}Test(inti){printf("Test::Test(inti)\n");this->i=i;}Test(constTest&obj){printf("Test::Test(constTest&obj)\n");this->i=obj.i;}staticvoidfunc(){printf("voidTest::func()\n");}voidfunc(inti){printf("voidTest::func(inti):%d\n",i);}intgetI(){returni;}};voidfunc(){printf("voidfunc()\n");}voidfunc(inti){printf("voidfunc(inti):%d\n",i);}intmain(){Testt;//Test::TestTestt1(1);//Test::Test(inti)Testt2(t1);//Test(constTest&obj)func();//voidfunc()Test::func();//voidTest::func()func(2);//voidfunc(inti),i=2;t1.func(2);//voidTest::func(inti),i=2t1.func();//voidTest::func()return0;}
我们看到在类里面定义了三种构造函数,它们也构成了重载关系,还有两个 func 函数。在全局函数中也定义了两个重载函数,它们和类中定义的函数也能构成重载吗?没在一个作用域,肯定是不行的。下来我们看看编译结果,看看分析的对不对
我们看到分析的和编译的结果是一致的。那么重载的意义是什么呢?a> 通过函数名对函数功能进行 提示;b> 通过参数列表对函数用法进行提示;c> 扩展系统中已经存在的函数功能;下来我们通过一个示例代码进行说明
#include<stdio.h>#include<string.h>/*char*strcpy(char*buf,constchar*str,unsignedintn){returnstrncpy(buf,str,n);}*/intmain(){constchar*s="helloworld";charbuf[8]={0};strcpy(buf,s);//strcpy(buf,s,sizeof(buf)-1);printf("%s\n",buf);return0;}
我们写了一个 strcpy 重载函数,我们先将他注释掉。首先来调用系统中自带的 strcpy 函数,看看编译结果
我们看到它在运行的时候报段错误了。我们再来试试自己写的重载函数呢
我们看到已经成功实现了,当然重载函数的内部是调用 strncpy 函数来实现的。但是我们只是复制,并不想考虑那么多,所以想直接用 strcpy 函数来实现这个功能,这样就很直接了。由此可见,重载能够扩展系统中已经存在的函数功能!!那么重载是否也能够扩展其他更多的功能呢?比如直接用 + 号来实现复数的相加呢?我们后面接着继续讨论。通过对类中的重载函数的学习,总结如下:1、类的成员函数之间可以进行重载,重载必须发生在同一个作用域中;2、全局函数和成员函数不能构成重载关系;3、重载的意义在于扩展已经存在的功能。
欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。