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、重载可以扩展已经存在的功能