C++新增基础功能解析—函数重载功能的使用

“函数重载”指的是可以有多个同名的函数,因此 名称进行了重载。这两个术语指的是同一回事,但我们通常使用函数重载。可以通过函数重载来设计? 系列函数——它们完成相同的工作,但使用不同的参数列表。
重载函数就像是有多种含义的动词。例如,Piggy×××可以在棒球场为家乡球队助威(root),也可以在地里种植(root)菌类作物。根据上下文可以知道在每一种情况下,root的含义是什么。同样,C++使用上下文来确定要使用的重载函数版本。
函数重载的关键是函数的参数列表——也称为函数特征标(ftmction signature).如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的特征标相同,而变量名是无关紧要的。C++允定义名称相同的函数,条件是它们的特征标不同。如果参数数目和/或参数类型不同,则特征标也不同。例如,可以定义一组原型如下的print()函数:

Void print(const char * str, int width) ;   // #1
Void print(double d, int width);            // #2
Void print(long 1, int width);           // #3
Void print(int i, int width);                // #4 frombyte
Void print(const char *str);                 // #5

使用pnnt()函数时,编译器将根据所采取的用法使用有相应特征标的原型:

print(” Pancakes", 15);         //use #1
print(” syrup");                //use #2
print(” 1999.0,10");                //use #3
print(” 1999,12");              //use #4
print(” 1999L,15");             //use #5 frombyte.com

例如,print(“Pancakes”,15)使用一个字符串和一个整数作为参数,这与#1原型匹配。 ,使用被重载的函数时,需要在函数调用中使用正确的参数类型。例如,对于下面的语句:

Unsigned int year =3210;
print (year, 6);            // ambiguous call

Print()调用与哪个原型匹配呢?它不与任阿原型匹配!没有匹配的圆形并不会自动停止使用其中的某个函数,因为C++将尝试使用标准类型转换强制进行匹配。如果#2原型是print()唯一的原型,则函数调用print(year,6)将把year转换为double类型。但在上面的代码中,有3个将数字作为第一个参数的原型,因此有3种转换year的方式。在这种情况下,C++将拒绝这种函数调用,并将其视为错误。
一些看起来彼此不同的特征标是不能共存的。例如,请看下面的两个原型:

duble cube (double x);
duble cube (double & x);

您可能认为可以在此处使用函数重载,因为它们的特征标看起来不同。然而,请从编译器的角度来考虑这个问题。假设有下面这样的代码:
cout.<< cube(x);
参数X与double x原型和double &x原型都匹配,因此编译器无法确定究竟应使用哪个原型。为避免这种混乱,编译器在检査函数特征标时,将把类型引用和类型本身视为同一个特征标。 匹配函数时,并不区分const和非const变量。请看下面的原型:

Void dribble(char * bits);
Void dribble (const char *cbits);
Void dabble(char * bits);
Void drivel(const char * bits);

下面列出了各种函数调用对应的原型:

Const char p1[20]="How’s the weather?";
Char p2[20]="How‘s business?";
Dribble(p1);        // dribble(const char *);
Dribble(p2);        // dribble(char *);
Dabble(p1);     // no match
Dabble(p2);     // dabble(char *);
Drivel(p1);     // drivel(const char *);frombyte.com
Drivel(p2);     // drivel(const char *);

dribble()函数有两个原型,一个用于const指针,另一个用于常规指针,编译器将根据实参是否为const来决定使用哪个原型。dribble()函数只与带非const参数的调用匹配,而drivel()函数可以与带const或非const参数的调用匹配。drivel?和dabble()之所以在行为上有这种差别,主要是由于将非const值赋给const变量是合法的,但反之则是非法的。
请记住,是特征标,而不是函数类型使得可以对函数进行重载。例如,下面的两个声明是互斥的:

long gronk(int n, float m); // same signatures,
double gronk(int n, float m);   // hence not allowed

因此,C++不允许以这种方式重载gronk()。返回类型可以不同,但特征标也必须不同:

long gronk(int n; float m); // different signatures,
double gronk(float n# float m); // hence allowed

原文地址:https://blog.51cto.com/sun510/2377865

时间: 2024-10-12 12:03:25

C++新增基础功能解析—函数重载功能的使用的相关文章

C++基础补遗篇—函数重载与Extern C

问题引出 之前提到C存在命名冲突问题,新的C++专门为此引入了namespace机制加以改进(后文介绍),此外还有另一种机制: int add(int i, int j) {    return i+i;  } float add(float a, float b, floatc)  {    return a+b+c;   } void main() { int a = add(8, 9); float b = add(7.7, 8.8, 9.9); } 上例在C环境下不成立,因为C编译器不允

[js高手之路]性能优化技巧 - 缓存与函数重载实战

所谓缓存,通俗点讲就是把已经做过的事情结果先暂时存起来,下次再做同样的事情,不用再重新去做,只要把之前的存的结果拿出来用即可,很明显大大提升了效率.他的应用场景非常广泛.如: 1.缓存ajax结果,大多数网站都会有产品推荐功能,比如按热销推荐,简单低效的做法,每次点击切换的时候,都要通过ajax去数据库中取出结果,其实他的结果并不是要实时去获取,完全可以用缓存技术保存起来,减少数据库处理压力 2.单例模式,也是缓存的应用 一.缓存原理与应用 我们先来一个的简单例子,比如,判断一个数是不是素数,普

Matlab中plot函数全功能解析

Matlab中plot函数全功能解析 功能 二维曲线绘图 语法 plot(Y)plot(X1,Y1,...)plot(X1,Y1,LineSpec,...)plot(...,'PropertyName',PropertyValue,...)plot(axes_handle,...)h = plot(...)hlines = plot('v6',...) 描述 plot(Y)如果Y是m×n的数组,以1:m为X横坐标,Y中的每一列元素为Y坐标,绘制n条曲线:如果Y是n×1或者1×n的向量,则以1:n

js中没有函数重载,怎样实现函数重载的功能?

js中没有函数重载,javasript中使用可选参数:arguments实现相同的功能.. 函数在定义的时候可不定义参数: <script type="text/javascript" > function say() { for (var i = 0; i < arguments.length; i++) { alert(arguments[i].toString()); } } </script> 调用:<input type="but

【原创】Matlab中plot函数全功能解析

[原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 二维曲线绘图 语法 plot(Y)plot(X1,Y1,...)plot(X1,Y1,LineSpec,...)plot(...,'PropertyName',PropertyValue,...)plot(axes_handle,...)h = plot(...)hlines = plot('v6

小猪猪C++笔记基础篇(六)参数传递、函数重载、函数指针、调试帮助

小猪猪C++笔记基础篇(六) ————参数传递.函数重载.函数指针.调试帮助 关键词:参数传递.函数重载.函数指针.调试帮助 因为一些事情以及自己的懒惰,大概有一个星期没有继续读书了,已经不行了,赶紧写一篇压压惊.把我文章抱走的同学留个言嘛. 函数在变成里面是一个非常重要的组成部分,那么这一部分我们先简单的介绍一下参数是如何传递进入函数,函数如何返回结果的.然后我们再来看看函数重载是个什么样的机制,最后在介绍一下所谓的函数指针到底是个什么东西.那么直接开始正题吧: 一.函数的参数传递 我们知道函

C++基础2 引用 函数扩展: 默认值 占位符 指针 重载 类:引用类指针 声明实现分开写

[难点]指针引用 [email protected]:~/c++$ cat main.cpp  #include <stdlib.h> #include "iostream" using namespace std; int a = 20; struct Teacher { int age; char name[64]; }; int fun1(struct Teacher ** p) { int ret = 0; if(p == NULL) { ret = -1; ret

[单选题]parse_url()函数的功能是:

验证URL,并返回给定的组件 将URL分裂成标准URL组件 全部都不正确 返回解码的URL php parse_url 函数教程 来源:   时间:2013-09-05 19:01:42   阅读数:13954 分享到: 2 [导读] php parse_url 函数教程parse_url ( PHP 4中, PHP 5中) parse_url -解析URL并返回其组成部分 描述 混合parse_url (字符串$网址[摘要$部分= -1 ] ) 此功能解析一个URL并返回一个关联数组含 php

Unity5 新功能解析--物理渲染与standard shader

Unity5 新功能解析--物理渲染与standard shader http://blog.csdn.net/leonwei/article/details/48395061 物理渲染是UNITY5最大的亮点之一,物理渲染的采用绝对是下一个世代游戏的热点,UNITY5的大范围使用是一个可喜可贺的事情,关于什么是物理渲染,本人曾经写过一篇博客专门讨论,详见http://blog.csdn.net/leonwei/article/details/44539217. 物理渲染和当今的主流光照计算最大