函数签名和重载

函数签名:函数的名称及其参数类型组合在一起,就定义了一个唯一的特性,称为函数签名。(不包括返回类型)

在编写包含函数调用的语句时,编译器就会使用该调用创建一个函数签名。再把它与函数原型/或定义中可用的函数签名集比较。如果找到匹配的函数名,就建立所调用的函数。

重载:多个相同函数名,不容的参数个数或者类型的形式叫做函数的重载。

attention:重载和引用参数

#include <iostream>
double larger(double a,double b);
long& larger(long& a,long& b);
using namespace std;
void main()
{

cout<<"lager of 1.5 and 2.5 is"<<larger(1.5,2.5)<<endl;
int value1=35;
int value2=45;
cout<<"lager of "<<static_cast<long>value1<<" and "<<static_cast<long>value2<<" is "<<larger(value1,value2)<<endl;
getchar();

}
double larger(double a,double b)
{
cout<<"double version:";
return a>b?a:b;
}
long& larger(long& a,long& b)
{
cout<<"long ref version:";
return a>b?a:b;
}

本来第二个进行了static_cast<long>之后输出期望是 “long ref version” ,为什么会是这个结果呢?

参数不是value1和value2,而是包含相同值的临时位置,这两个值转换为long类型。在幕后,编译器没有准备使用临时地址来吃石化引用,这太冒险了。larger()中的代码可以自由控制它对引用参数进行的操作,在理论上,两个引用参数都可以修改和返回。因为以这种方式使用临时位置不是很明智,所以编译器不使用。

该如何处理这个问题?

1 可以把value1 value2申明为long类型

2 如果环境不允许这么做,还可以把引用参数申明为const:   long& larger(const long& a,const long& b). 一定要在函数原型和定义处同时修改,通知编译器不能修改参数,于是编译器就允许调用这个版本,而不是参数为double的版本。

时间: 2025-01-06 17:11:46

函数签名和重载的相关文章

Android开发实践:JNI函数签名生成器

"函数签名"在Android NDK开发中很常见,由于Java支持重载,仅靠函数名无法唯一确定一个方法.因此,JNI提供了一套签名规则,用一个字符串来唯一确定一个Java端定义的Native方法. 具体每一种Java数据类型对应的签名字符串如下所示(来自Oracle官网JNI的介绍):     原理其实并不复杂,每种基本类型对应一个单字符签名,而类则对应为"L"+类的全路径+";",数组类型则对应"["+元素类型的签名,函数的

规范函数签名的必要性

函数签名即一个函数的函数名.参数列表.返回类型的统称:函数名一般表示该函数的功能,参数列表可看成是该函数完成它的功能所需要的额外条件,返回类型是指该函数完成其功能时,产生的结果的类型.在编码中,函数的调用者知道函数签名即可知道该函数的功能以及该函数所需要的参数列表和是否存在返回结果及返回结果的类型. 对于函数调用者而言,仅需要知道函数签名即可了解该函数的功能:对于函数开发者而言仅需要知道函数签名即可知道需要实现什么功能以及实现该功能的必要条件. 如何正确的函数签名: ①仔细阅读需求,理解需求的含

友元函数实现操作符重载的应用场景-友元函数实现左移右移操作符重载

先定义一个测试类Complex,其中用成员函数的方法重载了+.-.前置++.前置--.后置++.后置--这6个运算符,当然,这6个操作符也可以用友元函数方式重载,但习惯上这些都直接用成员函数方式重载. demo #include <iostream> using namespace std; class Complex { public: Complex(int a = 0, int b = 0) { this->a = a; this->b = b; } ~Complex();

函数签名

函数签名:是一个函数的函数名.参数列表.返回类型的统称 函数名 :代表函数的功能Add → 相加IsOdd → 判断是不是奇数IsPrime → 判断是不是质数 参数列表:函数为了完成它的功能,需要额外信息如果不需要额外信息,则参数列表为空 返回类型:函数完成功能后,产生的结果类型如果不需要产生结果,则返回了新为void 函数签名示例://从指定的链接地址下载文件,保存到指定路径 函数签名示例://根据提供的年和月,得到这个月的天数 函数签名示例://将提供的字符串,颠倒顺序后得到颠倒后的字符串

C用函数指针模拟重载 C++重载

C中为什么不支持重载,即同一作用域内不允许出现同名函数? 我们都知道重载是c++面向对象的特性.c语言中是不存在的.所谓重载简单来说就是一个函数名可以实现不同的功能,要么输入参数不同或者参数个数不同,要么返回类型不同.例如函数add(),在c++中可以轻易实现int,double等不同类型参数的相加功能,而在c语言中却不能这样实现.c语言中实现重载功能,或者准确来说是类似重载的功能,可以通过函数指针的方式来实现. 函数指针定义 形式1:函数类型 (*指针变量名)(形参列表): “函数类型”说明函

c++语言友元函数和成员函数对运算符重载

#include<iostream> using namespace std; /******************************************/ /*use member function to overload operator*/ /******************************************/ class RMB{ public: RMB(unsigned int d, unsigned int c); RMB operator + (RM

原生js函数的伪重载

一.我们在学习java的时候,其中方法有一个比较的重要的特性重载,根据传入的参数的个数来执行不同的方法,而方法其根据签名来判断,而JavaScript却不能根据方法的签名来进行重载,只能通过参数的个数的来进行实现伪重载. 在函数体中有个对象arguments,记录调用函数的传入的参数的对象: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title></title> 5 </head> 6 <bo

4 C++基础4 类 const函数 转全局函数 返回*this 数组类。友元 函数 类 操作符重载

1,请问类中函数 const修饰的谁? [email protected]:~/c++$ cat main.cpp  #include <iostream> #include <stdlib.h> using namespace std; class A { public: //const的三种写法 //const void fun(int a,int b) //void const fun(int a,int b) //void fun(int a,int b) const vo

[工作积累] JNI native 函数签名

对于一个Java 类 class MyClass { ... public boolean nativeMyFunc(long param); } 一般来说native对应的声明是这样: JNIEXPORT jboolean JNICALL Java_com_organisation_MyClass_nativeMyFunc(JNIEnv *env, jobject thiz, jlong param); 然后最近遇到个 class My_Class { ... public boolean n