`
jubincn
  • 浏览: 242735 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

重载是如何实现的?

 
阅读更多

转自:《高质量C/C++编程指南》

几个同名的重载函数仍然是不同的函数,它们是如何区分的呢?我们自然想到函数接口的两个要素: 参数与返回值。

如果同名函数的参数不同(包括类型、顺序不同),那么容易区别出它们是不同的函数。如果同名函数仅仅是返回值类型不同,有时可以区分,有时却不能。例如:


void Function(void);

intFunction (void);


上述两个函数,第一个没有返回值,第二个的返回值是 int 类型。如果这样调用函数:


intx = Function ();


则可以判断出 Function 是第二个函数。问题是在 C++/C 程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个 Function 函数被调用。所以只能靠参数而不能靠返回值类型的不同来区分重载函数。编译器根据参数为每个重载函数产生不同的内部标识符。例如编译器为示例 8-1-1 中的三个 Eat 函数产生象_eat_beef、_eat_fish、_eat_chicken 之类的内部标识符(不同的编译器可能产生不同风格的内部标识符)。


如果 C++程序要调用已经被编译后的 C 函数,该怎么办?
假设某个 C 函数的声明如下:


void foo(int x, int y);

该函数被 C 编译器编译后在库中的名字为_foo,而 C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能
直接调用 C 函数。C++提供了一个 C 连接交换指定符号 extern“C”来解决这个问题。
例如:
extern “C”
{
void foo(int x, int y);
... // 其它函数
}
或者写成
extern “C”
{
#include “myheader.h”
... // 其它 C 头文件
}
这就告诉 C++编译译器,函数 foo 是个 C 连接,应该到库中找名字_foo 而不是找_foo_int_int。C++编译器开发商已经对 C 标准库的头文件作了 extern“C”处理,所以我们可以用#include 直接引用这些头文件。


注:记得我在第一次接触重载时对为什么返回类型不加入函数签名很困惑,读到这里,恍然大悟。


分享到:
评论

相关推荐

    js中方法重载如何实现?以及函数的参数问题.docx

    然而,由于其灵活性,我们可以通过一些技巧来模拟实现方法重载的效果。这里我们将详细讨论如何在JavaScript中实现方法重载以及相关的函数参数问题。 ### 方法重载的实现 #### 1. `arguments` 对象 JavaScript 中...

    实现操作符重载 实现操作符重载

    1. 成员函数重载:将操作符作为类的成员函数来实现。这种方法使得操作符的左操作数成为隐含的`this`指针,即操作符作用于当前对象。例如: ```cpp class Vector { public: Vector operator+(const Vector& other) ...

    重载函数实现变量排序问题

    ### 重载函数实现变量排序问题 在C++编程语言中,函数重载(Function Overloading)是一项非常实用的功能,它允许我们定义多个同名但参数列表不同的函数。这种特性可以提高代码的可读性和复用性。本文将详细介绍...

    js中方法重载如何实现?以及函数的参数问题

    但尽管如此,我们依然可以通过巧妙地利用`arguments`对象来模拟实现方法重载。 `arguments`是一个类数组对象,它包含了函数调用时传入的所有参数。即使函数声明中指定了参数,`arguments`也会包含所有传递的实际...

    使用C++实现矩阵运算(运算符重载)

    例如,我们可以通过重载"+"运算符来实现矩阵的相加,重载"-"运算符进行矩阵的相减,重载"*"运算符实现矩阵乘法。通过重载,我们可以保持代码的直观性,使得矩阵操作与原始的数学表达式更为接近。 实现矩阵类时,...

    vs2010 MFC tabctrl控件重载, 实现标签加载BMP图片

    在本文中,我们将深入探讨如何在Visual Studio 2010中使用MFC(Microsoft Foundation Classes)库,特别是关于TabCtrl控件的重载,以便实现加载BMP图像以美化标签的功能。MFC是Microsoft为C++开发Windows应用程序...

    C++重载运算符实现分数的运算(有界面)

    在C++编程语言中,重载运算符是一种强大的...总的来说,这个项目展示了C++如何通过类和运算符重载来实现自定义数据类型的运算,并结合图形界面库提供用户交互。理解并掌握这些知识点对于提升C++编程能力非常有帮助。

    重载方法实现的向量的加减乘计算

    以上代码展示了如何通过C++中的类和运算符重载实现向量的加减乘运算。这个程序可能还包括其他功能,如打印向量、比较向量等,具体实现取决于实际需求。在实践中,为了提高代码可读性和可维护性,还可以考虑引入命名...

    java重载的实现方法

    Java重载的实现方法详解 Java重载(Overload)是Java编程语言中的一种机制,它允许在同一个类中定义多个方法,具有相同的名称,但参数列表不同。这种机制可以提高代码的灵活性和可读性。本文将详细介绍Java重载的...

    如何在c#中用虚拟的方法实现重载?其实很简单

    ### 如何在C#中利用虚拟方法实现重载:一个简明示例 在C#编程语言中,方法重载(Overloading)和方法重写(Overriding)是两个非常重要的概念,它们允许我们创建更加灵活和易于维护的代码。本文将通过一个具体的...

    C++ 复数类的实现 运算符重载

    在C++编程语言中,复数类的实现是面向对象编程的一个重要概念,它允许我们创建自定义数据类型来表示复数,并通过运算符重载为这些类型提供友好的操作接口。运算符重载是C++的一个强大特性,使得我们可以为自定义类型...

    C语言实现“+”的重载

    实现“+”的重载。(20分) 题目内容: 加法的重载,在C++中,“+”是可以被重载的,现在我们来实现这个功能。例如,如果两个数字相加,那么就给出两个数字的和,如果是字符串+字符串,那么应该输出两个字符串相连...

    重载内核实现绕过一切钩子-附详细文档

    本文将深入探讨“重载内核实现绕过一切钩子”的概念,以及如何通过驱动程序来实现这一目标。我们将主要关注内核级别的操作,因为这是绕过钩子的关键层次。 首先,我们需要理解内核在操作系统中的角色。内核是操作...

    编写实现函数重载程序

    在Java(或其他支持函数重载的语言)中,我们可以通过以下方式实现函数重载: 1. **改变参数数量**:例如,一个函数接受两个参数,另一个则接受三个参数。 2. **改变参数类型**:例如,一个函数接受整数,另一个则...

    c++ demo,重载运算符,友元函数的实现

    重载运算符是指在同一个作用域内为一个运算符提供多个不同的实现。这样做的目的是为了赋予运算符根据上下文的不同而有不同的含义。例如,我们可以为自定义类的加法运算符"+"重载,使其支持对象间的加法操作。在C++中...

    实验六函数重载与运算符重载

    1. **掌握函数重载的方法**:理解并能够实现同一名称但参数不同的多个函数,以便根据不同的参数类型或数量调用相应的函数体。 2. **掌握运算符重载的方法**:学会如何在用户自定义类型上重新定义C++语言中的内置...

    c++重载-实现复数相减

    ### C++重载实现复数相减的知识点详解 #### 一、概述 在C++编程语言中,重载(Overloading)是一种重要的特性,它允许我们为同一个操作符或函数提供不同的实现方式,以便更好地适应不同的数据类型或场景需求。在本...

    c++中运算符重载精讲

    C++中运算符重载精讲 C++中的运算符重载是一种强大的技术,它允许开发者重新定义C++语言中...我们可以通过重载运算符来实现自定义的运算符行为,并且可以使用流插入和提取运算符重载来实现自定义的流输入和输出行为。

    函数重载 程序

    3. 在C++和Java语言中的函数重载实现 4. 函数重载和代码重用的关系 5. 函数重载在图形处理、科学计算和游戏开发等领域中的应用 函数重载是面向对象编程的重要概念,它可以提高程序的灵活性和可读性,减少代码的重复...

Global site tag (gtag.js) - Google Analytics