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

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

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


🌈个人主页:主页链接


🌈算法专栏:专栏链接


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


🌈LeetCode专栏:专栏链接


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


🌈代码仓库:Gitee链接


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



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们并不知道.我们现在来看看


19769bfc6e3f458094159a4f0e197a3a.png


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


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


 int a=0;
 int b=a;
 printf("a:%p \nb:%p",&a,&b);

c2a0d5ad38654711b2d563d96745347f.png


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


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


 int a=0;
 int &b=a;
 printf("a:%p \nb:%p",&a,&b);


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

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


a5c6d54c04fb421c828f22fb01cae366.png

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


db32d691e44f451cb9a4d716072c543d.png


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;
}

4df893be22a4490e9b790db26b5ee3ae.png


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


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

fc9fdf967db14613bb03d71decf26e19.png


完结撒花:


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


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


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


🌈诸君,山顶见!

目录
相关文章
|
24天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
17 3
|
24天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
20 0
|
1月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
3月前
|
编译器 程序员 C语言
C++函数重载
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: void swap1(int *a, int *b); //交换 int 变量的值 void swap2(float *a, float *b); //交换 float 变量的值 void swap3(char *a, char *b); //交换 char 变量的
C++函数重载
|
3月前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持
|
3月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
32 5
|
3月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
45 4
|
4月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
32 3
|
4月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用