【C++深度解析】19、类中函数重载

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

<think>嗯,用户问了两个关于C++的问题,分别是函数重载的定义以及C++如何支持函数重载。首先,我需要确认自己对这两个问题的理解是否正确,然后组织回答的结构,确保符合用户的要求,比如使用中文、LaTeX格式正确,结构清晰等。 首先,问题19是关于函数重载的概念。用户已经给出了一个简要的回答,但可能需要更详细的解释。我需要补充函数重载的定义、条件(参数列表不同)、返回型是否影响重载,以及它的另一个名称“编译时多态”。同时,应该举例说明,这样更清晰。比如,用两个同名但参数不同的函数,比如一个接受int,另一个接受double。 然后问题20是C++如何支持函数重载。用户提到符号表的命名规则由函数名和参数组成,导致编译器能区分。我需要进一步解释名称修饰(name mangling)的机制,说明C++编译器在编译时如何生成不同的符号,从而允许链接器正确解析调用。对比C语言的情况,说明为什么C不支持而C++支持。同时,可能需要提到返回型不参与修饰,因此不能仅凭返回重载。 接下来检查用户的回答是否准确。用户对问题19的回答基本正确,但可以补充更多细节,比如参数型、数量、顺序的不同,返回型不影响,以及为什么叫编译时多态。对于问题20,用户提到了符号表的命名规则,正确,但需要更详细地解释名称修饰的过程,比如在gcc中的实际例子,或者不同编译器的处理方式不同,但原理一致。 还需要考虑面试回答的适当性。用户提到面试时这样回答是否可以,可能需要确认回答是否简洁准确,是否涵盖了关键点。比如,问题20的回答是否应该提到名称修饰和与C的对比,这样能展示更深入的理解。 另外,注意用户提到的格式要求:行内公式用$...$,独立公式用$$...$$。但这两个问题可能不需要数学公式,所以可能不需要使用LaTeX数学表达式,但如果有涉及的话要确保正确。例如,如果有提到参数列表的型,可以用$int$、$double$之的,但可能不需要,这里可能不需要数学表达式,所以可能不需要调整。 最后,确保回答结构清晰,分点回答,每个问题有总结和可能的面试技巧。例如,在问题20的总结中,提醒面试时可以补充名称修饰和与C语言的对比,展示知识深度。</think>### 19. 什么是函数重载函数重载(Function Overloading)是 C++ 中的一种特性,允许在同一作用域内定义多个**同名函数**,但这些函数的**参数列表必须不同**。具体区别可以是: - **参数型不同**(例如:`int` vs `double`) - **参数数量不同**(例如:1 个参数 vs 2 个参数) - **参数顺序不同**(例如:`(int, double)` vs `(double, int)`) **关键点**: - 返回值型**不参与重载判定**(仅参数列表不同)。 - 是**编译时的多态**(静态绑定),编译器根据调用时传递的参数型和数量,在编译阶段确定调用哪个函数。 **示例**: ```cpp void print(int x) { /* ... */ } // 参数型为 int void print(double x) { /* ... */ } // 参数型为 double void print(int x, int y) { /* ... */ } // 参数数量不同 ``` --- ### 20. C++ 如何支持函数重载C++ 通过 **名称修饰(Name Mangling)** 实现函数重载。具体机制如下: 1. **符号表命名规则**: C++ 编译器在生成符号表时,将 **函数名 + 参数型** 组合成一个唯一的内部名称(例如:`_Z5printi` 表示 `print(int)`,`_Z5printd` 表示 `print(double)`)。 2. **区分函数**: 即使函数名相同,参数列表不同的函数会被编译器视为不同的符号,从而在链接阶段能正确绑定到目标函数。 3. **与 C 的对比**: C 语言没有名称修饰,函数符号仅依赖函数名,因此不支持重载。 **面试回答建议**: 可以按以下结构回答: 1. **核心机制**:名称修饰(函数名 + 参数型生成唯一符号)。 2. **对比 C 语言**:解释为何 C 不支持重载。 3. **附加说明**:返回值型不参与名称修饰,因此不能仅凭返回值重载。 --- ### 总结 - **问题 19 回答**:准确,但可补充“参数列表不同”的具体形式(型、数量、顺序)。 - **问题 20 回答**:正确,面试时可进一步举例名称修饰的细节(如 `g++` 生成的符号名称),展示对底层机制的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值