1 重载回顾
前面我们已经学习了函数重载,现在来回顾一下:
- C++通过函数名和函数参数确定函数调用,本质为相互独立的不同函数
- 无法通过函数名得到重载函数的入口地址
- 函数重载必然发生在同一作用域中
2 成员函数重载
类中的成员函数也可以进行重载,万变不离其宗
- 重载函数的本质为多个不同的函数
- 函数名和参数列表是唯一的标识
- 函数重载必须发生在统一作用域中
// 19-1.cpp
#include<stdio.h>
class Test
{
public:
Test()
{
printf("Test()::Test()\n");
this->x = 0;
}
Test(int i)
{
printf("Test()::Test(int i), i = %d\n", i);
x = i;
}
Test(const Test& t)
{
printf("Test()::Test(const Test& t)\n");
this->x = t.x;
}
static void func()
{
printf("Test()::func()\n");
}
void func(int i)
{
printf("Test()::func(int i) : i = %d\n", i);
}
void func(int i) const
{
printf("Test()::func(int i) const: i = %d\n", i);
}
private:
int x;
};
void func()
{
printf("func()\n");
}
void func(int i)
{
printf("func(int i) : i = %d\n", i);
}
int main()
{
func();
func(1);
Test t;
Test t1(1);
const Test t2(t1);
t1.func();
t1.func(1);
t2.func(1);
return 0;
}
类成员函数 void Test::func(); void Test::func(int i); 和全局函数 void func(); void func(int i); 不在同一作用域,不构成函数重载。
成员函数
static void func();
void func(int i);
void func(int i) const;
三者之间构成重载,const 对象只能调用 const 成员函数。
$ g++ 19-1.cpp -o 19-1
$ ./19-1
func()
func(int i) : i = 1
Test()::Test()
Test()::Test(int i), i = 1
Test()::Test(const Test& t)
Test()::func()
Test()::func(int i) : i = 1
Test()::func(int i) const: i = 1
3 重载的意义
利用重载,我们可以扩展系统中已经存在的函数功能。
// 19-2.cpp
#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[5] = { 0 };
strcpy(buf, s, sizeof(buf)-1);
printf("%s\n", buf);
return 0;
}
char *strcpy(char *dest, const char *src) 可以完成字符串拷贝,可是如果目的空间不够大时就会出错。
我们还想继续使用 strcpy 函数,利用函数重载就可以扩展函数的功能。
编译运行
$ g++ 19-2.cpp -o 19-2
$ ./19-2
Hell
4 小结
1、类的成员函数之间可以进行重载
2、重载必须发生在同一个作用域中,全局函数和成员函数不构成重载
3、重载可以扩展已经存在的功能