• C++学习4


    在C++中,定义函数时可以给参数指定一个默认的初始值。调用函数时,可以省略有默认值的参数。也就是说,如果用户指定了参数的值,那么就使用用户指定的值,否则使用参数的默认值。

    C++规定,默认参数只能放在形参列表的最后,而且一旦为某个参数指定了默认值,那么它后面的所有参数都必须有默认值。实参和形参的传值是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提。

    除了函数定义,你也可以在函数声明中指定默认参数。不过默认参数只能指定一次,在声明中指定了就不能在定义中指定,反过来也一样。请看下面的例子:

    默认参数和重载

    默认参数和重载不能同时出现:使用了默认参数就不能使用重载,使用了重载也不能使用默认参数,它们是相互冲突的。因为当调用函数时如果少写一个参数,编译器就无法判定是利用函数重载还是利用默认参数,会出现二义性,无法执行。

    2016.8.19   (引用就如自己的小名)

    引用(Reference)是C++相对于C语言的又一个扩充。引用类似于指针,只是在声明的时候用 & 取代了 *。引用可以看做是被引用对象的一个别名,在声明引用时,必须同时对其进行初始化。引用的声明方法如下:

    类型标识符 &引用名 = 被引用对象

    C++引用示例

    int a = 10;
    int &b = a;
    cout<<a<<" "<<b<<endl;
    cout<<&a<<" "<<&b<<endl;

    在本例中,变量 b 就是变量 a 的引用,程序运行结果如下:
    10 10
    0018FDB4 0018FDB4

    从运行结果可以看出,变量 a 和变量 b 都是指向同一地址的,也即变量 b 是变量 a 的另一个名字,也可以理解为 0018FDB4 空间拥有两个名字:a和b。由于引用和原始变量都是指向同一地址的,因此通过引用也可以修改原始变量中所存储的变量值,如例2所示,最终程序运行结果是输出两个20,可见原始变量a的值已经被引用变量b修改。

    通过引用修改原始变量中的值:

    int a = 10;
    int &b = a;
    b = 20;
    cout<<a<<" "<<b<<endl;

    如果我们不希望通过引用来改变原始变量的值时,我们可以按照如下的方式声明引用:

    const 类型标识符 & 引用名 = 被引用的变量名

    这种引用方式成为常引用。如例3所示,我们声明b为a的常引用,之后尝试通过b来修改a变量的值,结果编译报错。虽然常引用无法修改原始变量的值,但是我们仍然可以通过原始变量自身来修改原始变量的值,如例3中,我们用a=20;语句将a变量的值由10修改为20,这是没有语法问题的。

    不能通过常引用来修改原始值:

    int a = 10;
    const int &b = a;
    b = 20;   //compile error
    a = 20;

    1) 函数引用参数

    如果我们在声明或定义函数的时候将函数的形参指定为引用,则在调用该函数时会将实参直接传递给形参,而不是将实参的拷贝传递给形参。如此一来,如果在函数体中修改了该参数,则实参的值也会被修改。这跟函数的普通传值调用还是有区别的。

    2) 函数引用返回值

    在C++中非void型函数需要返回一个返回值,类似函数形参,我们同样可以将函数的返回值声明为引用。普通的函数返回值是通过传值返回,即将关键字return后面紧接的表达式运算结果或变量拷贝到一个临时存储空间中,然后函数调用者从临时存储空间中取到函数返回值,如例4所示。

    函数的普通返回值:

    #include<iostream>
    using namespace std;
    int valplus(int &a);
    int main(){
        int num1 = 10;
        int num2;
        num2 = valplus(num1);
        cout<<num1<<" "<<num2<<endl;
        return 0;
    }
    int valplus(int &a){
        a = a + 5;
        return a;
    }

    valplus函数采用的是普通的传值返回,也即将变量a的结果加上5之后,将结果拷贝到一个临时存储空间,然后再从临时存储空间拷贝给num2变量。 当我们将函数返回值声明为引用的形式时,如例5所示。虽然例5运行结果和例4是相同的,但例5中的valplus函数在将a变量加上5之后,其运算结果是直接拷贝给num2的,中间没有经过拷贝给临时空间,再从临时存储空间中拷贝出来的这么一个过程。这就是普通的传值返回和引用返回的区别。

    函数的引用返回值:

    #include<iostream>
    using namespace std;
    int & valplus(int &a);
    int main(){
        int num1 = 10;
        int num2;
        num2 = valplus(num1);
        cout<<num1<<" "<<num2<<endl;
        return 0;
    }
    int & valplus(int &a){
        a = a + 5;
        return a;
    }
  • 相关阅读:
    读后感之—寒门学子重要选择-程序员
    架构中的分而治之
    如何从码农进化到项目管理者
    饿了么架构
    简单理解支付宝和蚂蚁花呗的架构
    架构小谈之美团外卖
    漫谈架构总结之1500
    平台基本信息项目目标文档
    第六学期每周总结-第三周
    质量管理之可用性战术分析
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/5786072.html
Copyright © 2020-2023  润新知