• C++_函数3-引用变量与函数的默认参数


    引用变量

           C++新增了一种复合类型——引用变量。

           引用是已定义的变量的别名。例如将twain作为clement变量的引用,则可以交替使用twain和clement来表示该变量。

           引用变量的主要用途:用作函数的形参。通过将引用变量作为参数,函数将使用原始数据,而不是其副本。引用也为函数处理大型结构提供了一种非常方便的途径。同时,对于设计类来说,引用是必不可少的。

           定义和使用引用的基本知识。

    创建引用变量

           &运算符被用来指示变量的地址。C++给&符号赋予了另一个含义,将其用来声明引用。例如:将rodents作为rats变量的别名

           int rats;

           int & rodents = rats;

           //&不是地址运算符,而是类型标识符的一部分。int &指的是指向int的引用。上述引用声明允许将rats和rodents互换。它们指向相同的值和内存单元。

           可以理解成一个变量有两个名称(一个地址)。

           引用不同于指针;

           引用必须在声明时将其初始化。不能像指针那样,先声明,再赋值。

     

           引用更接近与const指针。必须在创建时进行初始化。一旦与某个变量关联起来,就一直效忠于它。

           实际上int & rodents = rats;

           是下述代码的伪装:

                  int * const pr = &rats;

          

    将引用用作函数参数

           引用被常用作函数参数。使得函数中的变量名称为调用程序中的变量的别名。这种传递参数的方法被称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。C++这种新增的特性是对C语言的超越。C语言只能按值传递。按值传递导致被调用函数使用调用程序中值的拷贝。当然C语言也允许避开按值传递的限制,采用按指针传递的方式。

     

    使用按引用传递,来设计一个交换两个值的函数:

    void swapr(int & a, int & b);

    a b分别是调用函数中变量wallet1和wallet2的别名。所以交换a和b的值相当于交换wallet1和wallet2的值。

    注意:如果既想使用引用,又不想对这些信息进行修改的话;应该使用常量引用

    double refcube(const double &ra) ;

    如果这样做,一旦编译器发现代码修改了ra的值时,将生成错误消息。

     

    引用的属性和特别之处

    临时变量、引用参数和const

           如果实参与引用参数不匹配,C++将生成临时变量。当前,仅当参数为const引用时,C++才允许这样做。

    double refcube(const double & ra);

    double z =refcube(x+3.0)  //由于不允许将表达式传递给引用变量。将生成临时变量,将其初始化为表达式x+3.0的值。

           什么时候将创建临时变量?前提是引用参数是const

                  实参的类型正确,但不是左值;

                  实参的类型不正确,但是可以转化为正确的类型;

    左值是什么?左值参数是可被引用的数据对象、例如变量、数组元素、结构成员、引用和解除引用的指针。最初左值指的是在赋值语句左边的实体。后来常规变量、const变量都可以视为左值。

    将引用用于结构

           引用非常适合用于结构和类。

           引入引用主要是为了用于这些类型的,而不是基本的内置类型。

           使用结构引用参数的方式与使用基本变量引用相同。只需在声明结构参数时使用引用运算符&即可。

     

    struct free_throws

    {

           std:: string name;

           int made;

           int attempts;

           float percent;

    };

    函数原型,在函数中将指向该结构的引用作为参数:

    void set_pc(free_throws & ft);

     

    如果不希望函数修改传入的结构,可使用const:

    void display(const free_throws & ft);

    将引用用于类对象

    将类对象传递给函数时,C++通常的做法是使用引用。

    对象、继承和引用

           继承的一个特征:派生类可以继承基类的方法,ofstream对象可以使用基类ostream的方法。

           继承的另一个特征:基类引用可以指向派生类的对象,无需进行强制类型转换。可以定义一个接收基类引用作为参数的函数,调用该函数时,可以将基类对象作为参数,也可以将派生类对象作为参数

     

    何时使用引用参数

    使用引用参数的主要原因有两个:

           程序员能够修改调用函数中的数据对象。

           通过传递引用而不是整个数据对象,可以提高程序的运行速度。

     

    什么时候使用引用?什么时候应使用指针?什么时候应按值传递?以下有一些指导原则:

    对于使用传递的值而不作修改的函数:

           如果数据对象很小,如内置数据类型或小型结构,则按值传递;

           如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针。

           如果数据对象是较大的结构,则使用const指针或const引用,以提高程序的效率。这样可以节省复制结构所需的时间和空间。

           如果数据对象是类对象,则使用const引用。传递类对象参数的标准方式是按引用传递。

          

    对于修改调用函数中数据的函数:

           如果数据对象是内置数据类型,则使用指针。

           如果数据对象是数组,则只能使用指针。

           如果数据对象是结构,则使用引用或指针。

           如果数据对象是类对象,则使用引用。

    ======================================

    默认参数

           默认参数是指:当函数调用中省略了实参时自动使用的一个值。

           如果void wow(int n) 设置成n有默认值1,则函数调用wow()相当于wow(1)。

     

           如何设置默认值?必须通过函数原型。由于编译器通过查看原型了解函数所使用的参数数目,因此函数原型也必须将可能的默认参数告知程序。方法是将值赋给原型中的参数。例如:

           char * left(const char * str, int n=1);

    通过使用默认值,可以减少要定义的析构函数,方法及方法重载的数量。

  • 相关阅读:
    无监督学习在反欺诈中的应用
    Java中Object对象方法
    ambari下httpfs安装
    深入理解spark-rdd详解
    Tensorflow实践Basic Classification
    深入理解spark-两种调度模式FIFO,FAIR模式
    深入理解spark-taskScheduler,schedulerBackend源码分析
    js模仿页面点击
    记一次请求走私学习
    十种常见的报错注入
  • 原文地址:https://www.cnblogs.com/grooovvve/p/10467727.html
Copyright © 2020-2023  润新知