类中的函数重载(二十三)

        今天我们来讲讲函数重载。函数重载的本质为相互独立的不同函数,在 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 函数。在全局函数中也定义了两个重载函数,它们和类中定义的函数也能构成重载吗?没在一个作用域,肯定是不行的。下来我们看看编译结果,看看分析的对不对

图片.png

        我们看到分析的和编译的结果是一致的。那么重载的意义是什么呢?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 函数,看看编译结果

图片.png

        我们看到它在运行的时候报段错误了。我们再来试试自己写的重载函数呢

图片.png

        我们看到已经成功实现了,当然重载函数的内部是调用 strncpy 函数来实现的。但是我们只是复制,并不想考虑那么多,所以想直接用 strcpy 函数来实现这个功能,这样就很直接了。由此可见,重载能够扩展系统中已经存在的函数功能!!那么重载是否也能够扩展其他更多的功能呢?比如直接用 + 号来实现复数的相加呢?我们后面接着继续讨论。通过对类中的重载函数的学习,总结如下:1、类的成员函数之间可以进行重载,重载必须发生在同一个作用域中;2、全局函数和成员函数不能构成重载关系;3、重载的意义在于扩展已经存在的功能。


        欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083

猜你喜欢

转载自blog.51cto.com/12810168/2118623