今天我们来讲讲函数重载。函数重载的本质为相互独立的不同函数,在 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)\n"); this->i = i; } Test(const Test& obj) { printf("Test::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): %d\n", i); } int getI() { return i; } }; void func() { printf("void func()\n"); } void func(int i) { printf("void func(int i): %d\n", i); } int main() { 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; }
我们看到在类里面定义了三种构造函数,它们也构成了重载关系,还有两个 func 函数。在全局函数中也定义了两个重载函数,它们和类中定义的函数也能构成重载吗?没在一个作用域,肯定是不行的。下来我们看看编译结果,看看分析的对不对
我们看到分析的和编译的结果是一致的。那么重载的意义是什么呢?a> 通过函数名对函数功能进行 提示;b> 通过参数列表对函数用法进行提示;c> 扩展系统中已经存在的函数功能;下来我们通过一个示例代码进行说明
#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 = "hello world"; char buf[8] = {0}; strcpy(buf, s); // strcpy(buf, s, sizeof(buf)-1); printf("%s\n", buf); return 0; }
我们写了一个 strcpy 重载函数,我们先将他注释掉。首先来调用系统中自带的 strcpy 函数,看看编译结果
我们看到它在运行的时候报段错误了。我们再来试试自己写的重载函数呢
我们看到已经成功实现了,当然重载函数的内部是调用 strncpy 函数来实现的。但是我们只是复制,并不想考虑那么多,所以想直接用 strcpy 函数来实现这个功能,这样就很直接了。由此可见,重载能够扩展系统中已经存在的函数功能!!那么重载是否也能够扩展其他更多的功能呢?比如直接用 + 号来实现复数的相加呢?我们后面接着继续讨论。通过对类中的重载函数的学习,总结如下:1、类的成员函数之间可以进行重载,重载必须发生在同一个作用域中;2、全局函数和成员函数不能构成重载关系;3、重载的意义在于扩展已经存在的功能。
欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。