您现在的位置是:首页 >学无止境 >【C++技能树】原来比C方便这么多 --缺省参数、函数重载、引用讲解网站首页学无止境

【C++技能树】原来比C方便这么多 --缺省参数、函数重载、引用讲解

ppeua 2023-05-21 12:00:02
简介【C++技能树】原来比C方便这么多 --缺省参数、函数重载、引用讲解

 

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

目录

1.缺省参数:

2.函数重载:

3.引用:

完结撒花:

 

1.缺省参数:

在C++中

如果想要在一个函数不给定具体参数的情况下使用一个默认值就可以用到缺省参数这个概念.

具体用法如下在声明/定义时给定默认值即可,

int add(int a=0,int b=1);
int add(int a,int b)
{
    return a+b;
}
int main()
{
    cout<<add(12);
}

例如这里就给定了第一个参数.而没有给第二个参数,所以默认为1,所以A+B的值就变成了13

注意!!

int add(int a=0,int b=1);
int add(int a=0,int b=1)
{
    return a+b;
}

不能在声明与定义同时给出默认参数,即使值是一样,这样也是错的.

所以只能在一个地方(声明/定义)给定默认值.一般在声明时给出

可以全部给定默认值,也可以只给一部分.但只能从右到左连续的给出.

int add(int a,int b=1,int c=2)
{
    return a+b+c;
}
int main()
{
    cout<<add(12);
}

这样就属于跳着给,也是不可以的

int add(int a=1,int b,int c=2)
{
    return a+b+c;
}

2.函数重载:

在C中,若想要使用使用一个add函数返回两数相加的结果.因为这个两数可以是浮点数,整数等.若我们想要准确的表示两个数据相加.就得定义若干个异名函数.

int addi(int a,int b)
{
    return a+b;
}
double addd(double a,double b)
{
    return a+b;
}

例如这里定义了addi表示两个整数相加,又定义了addd表示两个浮点数相加.

那如果我是写库的作者,我需要让一个仅需要相加功能的调用者去了解这么多函数的名字,仅用来区分他们相加的数据类型嘛?

这样的工作效率显然是非常低的,所以C++改进了他的方法.

int add(int a,int b)
{
    return a+b;
}
double add(double a,double b)
{
    return a+b;
}

这两个同名函数,因为参数类型的不同,所以在C++中可以同时存在. 

这就是函数重载的概念.

区分两个函数是否相同不再仅通过名字,而是通过参数个数/类型/类型顺序来区分.

返回值不同不作为区分函数重载的规则,因为你调用该函数的时候可以不适用返回值。

void add(int a,double b); 类型顺序

void add(double a,int b); 类型顺序 参数个数

void add(double a,int b,int c); 参数个数

 为什么能进行区分呢?

因为在C++中,在编译阶段,会这样对函数进行命名.

第一个函数被命名为:addid 表示参数类型为int 与 double

第二个函数被命名为:adddi 表示参数类型为double 与 int

第三个函数被命名为: adddii 表示参数类型为double、int、int 

使用重载函数并不会导致程序运行变慢,因为改变名字的事是在编译阶段就完成了,程序运行阶段直接去寻找对应的函数.所以并不需要有这种担心.

3.引用:

先来看看我们最开始学编程的时候学习的代码

int a=0;

int b=a;

这段代码很简单,但他在内存里做的事相信很多uu们并不知道.我们现在来看看

这段代码是将a指向的数据又拷贝了一份放在b中,也就是a、b变成了两个独立的个体.他们的共同点也就是值相同.

我们可以打印他的地址来看看

 int a=0;

 int b=a;

 printf("a:%p b:%p",&a,&b);

 

结果如图所示,说明我们说的是对的.

那我们再来看看C++新加入的引用特点.

 int a=0;

 int &b=a;

 printf("a:%p b:%p",&a,&b);

仅在b前面加上一个&(注意!!!加在a前表示取地址)

再打印地址,看看会发生什么.

 他们的内存地址相同了!也就是现在的内存模型应该长这样

 a b都表示这块内存地址的一个别名.除了名字不同,其他都是相同的.也就是改变a也会改变b

这段代码同样的非常简单,但是这样写是错的,因为形参的改变不影响实参,我们仅需这样改动 

void swap(int a,int b)
{
    int tmp=a;
    a=b;
    b=tmp;
}
int main()
{
    int a=2;
    int b=3;
    swap(a,b);
    cout<<"a:"<<" "<<a<<endl;
    cout<<"b: "<<b<<endl;
}

  

 在函数调用参数前加上&,表示对实参的引用,这样他们使用的是同一块内存空间.也就可以直接改变了

void swap(int &a,int &b)
{
    int tmp=a;
    a=b;
    b=tmp;
}
int main()
{
    int a=2;
    int b=3;
    swap(a,b);
    
}

 

 

完结撒花:

🌈本篇博客的内容【原来比C方便这么多 --缺省参数、函数重载、引用讲解】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。