目录

函数重载(overload)

函数重载原理

什么情况下,函数不能被重载 

默认参数及引用参数

默认参数:

引用参数:

使用默认参数注意事项


函数重载(overload)

在传统的C语言中,函数名必须是唯一的,程序中不允许出现同名的函数。在C++中是允许出现同名的函数,这种现象称为函数重载。

函数重载的目的就是为了方便的使用函数名。

函数重载原理

 编译器为了实现函数重载,也是默认为我们做了一些幕后的工作,编译器用不同的参数类型来修饰不同的函数名,比如void func();编译器可能会将函数名修饰成_func,当编译器碰到void func(int x),编译器可能将函数名修饰为_func_int,当编译器碰到void func(int x,char c),编译器可能会将函数名修饰成_func_int_char,以此作为区分。

函数重载切记要避免二义性,只能以参数作为唯一的区别。

返回值,函数名,作用域必须一样!

全局变量和类成员函数同名,不叫函数重载,因为作用域不一样!

.h

void func();
void func(int x);
void func(int x,double y);
void func(double x,int y);

.cpp 

void func()
{
    qDebug()<<"无参数";
}
void func(int x)
{
    qDebug()<<"int x";
}
void func(int x,double y)
{
    qDebug()<<"int x,double y";
}
void func(double x,int y)
{
    qDebug()<<"double x,int y";
}
    func();//无参数
    func(1);//int x
    func(1,1.2);//int x,double y
    func(1.2,3);//double x,int y

什么情况下,函数不能被重载 

内容来源:C++函数重载(2) - 不能被重载的函数 https://blog.csdn.net/shltsh/article/details/45938663

 仅仅是返回值不同

#include<iostream>
int foo() {
  return 10;
}
char foo() {
  return 'a';
}
int main()
{
  char x = foo();
  getchar();
  return 0;
}
————————————————
版权声明:本文为CSDN博主「水草」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shltsh/article/details/45938663

成员函数名称以及参数完全相同,仅仅其中一个是static成员函数

函数参数仅仅是指针与数组的差别。这样实际上是相等的

函数差别仅在于参数类型,其中一个是函数类型,另一个是相同类型的函数指针。这样实际上是相等的

也间接证明了函数当参数的时候会退化为指针

int fun(int *ptr);
int fun(int ptr[]);  //相当于fun(int *ptr)的重复声明
————————————————
版权声明:本文为CSDN博主「水草」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shltsh/article/details/45938663

函数参数差别仅在于有无const,按值传递不可以,按指针传递可以,常函数可以

按值传递,修改与否都不影响原来的值,但是按照引用和指针传递,会影响

函数之间的差别仅在于默认参数值的不同。这样实际上也是相等的

#include<iostream>
#include<stdio.h>
using namespace std;
int f ( int x, int y) {
    return x+10;
}
int f ( int x, int y = 10) {
    return x+y;
}
int main() {
  getchar();
  return 0;
}
————————————————
版权声明:本文为CSDN博主「水草」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shltsh/article/details/45938663

默认参数及引用参数

默认参数:

void func(int x)
{
    qDebug()<<"int x";
}
void func(int x,double y = 2.2)
{
    qDebug()<<"int x,double y";
}

这种情况,函数重载会报错。 

以上就会报错,因为二义性,书写语句func(1);程序也不知道是调用哪儿个函数,可以是第一个,也可以是第二个。

引用参数:

.h

void func(int x);

void func(const int & x);

.cpp 

void func(int x)
{
    qDebug()<<"int x";
}

void func(const int & x)
{
    qDebug()<<"const int & x";

}

不同编译器会有不一样的结果,注意,使用引用传递参数时,一定要是有效的内存地址,不要是什么局部变量。

使用默认参数和引用时一定要小心和注意。

 

 

使用默认参数注意事项

唯一要注意的,从默认参数起,往右,全部都要是默认参数

void func(int i,int j = 1,int y = 0);//没有问题
void func(int i,int j = 1,int y);//有问题

调用的时候,可以给默认参数再次赋值

//.h
void func(int i,int j = 1);
//.cpp
void func(int i,int j = 1)
{
    .....
}

......

func(1);//ok

func(1,2);//ok,给默认参数重新赋值

......
阅读全文
AI总结
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐