做韦恩图的网站,青海省住房和建设厅网站首页,音乐网站可以用什么语言做,公司以前做的免费网站太多 新网站搜索不到4.2.4 函数重载
有时您可能想要两个非常相似但参数和实现不同的函数。传统做法是#xff0c;您必须为每个函数想出一个稍微不同的名称#xff0c;但是现代编程语言允许您对一个函数符号进行多次定义。
重载的概念很简单#xff1a;编译器允许您使用相同的名称定义两…4.2.4 函数重载
有时您可能想要两个非常相似但参数和实现不同的函数。传统做法是您必须为每个函数想出一个稍微不同的名称但是现代编程语言允许您对一个函数符号进行多次定义。
重载的概念很简单编译器允许您使用相同的名称定义两个或两个以上的函数或过程前提是参数不同。通过检查参数编译器可以确定您正在调用哪个版本的函数。
考虑一下从运行时库的System.Math单元中提取的这系列函数
function Min(A, B: Integer): Integer; overload;
function Min(A, B: Int64): Int64; overload;
function Min(A, B: Single): Single; overload;
function Min(A, B: Double): Double; overload;
function Min(A, B: Extended): Extended; overload; 当您调用Min(10, 20)时编译器确定您正在调用Min的多个版本中的第一个函数它接受两个整数并返回一个整数。
重载有两个基本规则
重载函数或过程的每个版本其后必须跟overload关键字包括第一个版本。重载的函数之间参数的数量或类型必须有所不同。参数名称不用考虑因为它们在调用时未指定。而且返回类型不能用于区分两个重载的函数。 **注解**不能根据返回值区分函数的规则有一个例外那就是第 5 章中将介绍的隐式和显式(Implicit and Explicit conversion)转换操作符。 以下是我添加到Overload-Test示例中的三个重载版本的ShowMsg过程
procedure ShowMsg(Str: string); overload;
beginShow(Message: Str);
end;procedure ShowMsg(FormatStr: string; Params: array of const); overload;
beginShow(Message: Format(FormatStr, Params));
end;procedure ShowMsg(I: Integer; Str: string); overload;
beginShow(I.ToString Str); 这三个函数显示了一个带有字符串的消息框之后可以用不同的方式格式化字符串。以下是这三个过程的调用
ShowMsg(Hello);
ShowMsg(Total %d., [100]);
ShowMsg(10, MBytes);这是它们的效果 Message: HelloMessage: Total 100.Message: 10 MBytes小贴士 IDE的Code Parameters技术在处理重载的过程和函数时效果非常好。在键入例程名称后的开括号后将列出所有可用的方案。随着输入参数Code Insight技术使用它们的类型确定哪些可选方案仍然有效。 如果尝试使用不匹配任何可用重载版本的参数调用函数会发生什么呢当然您会收到错误消息。假设您想调用
ShowMsg(10.0, Hello); 在这种情况下您将看到一个非常明确的错误
[dcc32 Error] E2250 There is no overloaded version of ShowMsg that can be called with these arguments 重载例程的每个版本都必须正确标记这意味着不能重载未使用overload关键字标记的同一单元的现有例程。
当您尝试这样做时您会收到以下错误消息
Previous declaration of name was not marked with the overload directive. 但是您可以创建与不同单元例程同名的例程因为单元充当了命名空间。在这种情况下您并没有使用新版本重载了函数而是使用新版本替换了该函数隐藏了原始函数可以使用单元名称前缀引用它。这就是为什么编译器无法根据参数选择合适版本但它将尝试匹配它看到的唯一版本如果参数类型不匹配则会发出错误。