引用变量

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

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

C++_函数3-引用变量与函数的默认参数的更多相关文章

  1. C++ : 内联函数和引用变量

    一.内联函数 内联函数和普通函数的使用方法没有本质区别,我们来看一个例子,下面展示了内联函数的使用方法: #include <iostream> using namespace std; ...

  2. JS静态变量和函数、实例变量和函数以及prototype 说明

    静态变量.函数 当定义一个函数后通过 “.”为其添加的属性和函数,通过对象本身仍然可以访问得到,但是其实例却访问不到,这样的变量和函数分别被称为静态变量和静态函数,用过Java.C#的同学很好理解静态 ...

  3. 关于图像读取函数imread()的一点使用经验,注意默认参数的赋值

    读入数字图像到数组,用CNN进行训练,发现关于图像读取的一个问题. 问题描述:读取灰度数字图像,在验证时发现存在错误,从图像到数组中的值不完全一样? main code as follows: int ...

  4. template-web.js 引用变量、函数

    1.关键字   $imports.+变量/函数 {{if $imports.myParseInt(b.health_money)}} <span class="num"> ...

  5. (转)Const,Const函数,Const变量,函数后面的Const

    本文转自http://www.cnblogs.com/Fancyboy2004/archive/2008/12/23/1360810.html 看到const 关键字,C++程序员首先想到的可能是co ...

  6. js中在一个函数中引用另一个函数中的函数,可以这么做

    在另一个函数中,将需要使用的函数绑定在window下 // UEditor $(function () { window.ue = UE.getEditor('editor', { // ue即可成为 ...

  7. PHP 函数的“引用返回”概念释疑(转)

    很多时候我们会看到这样的代码(出自 CI 框架源码): 1 $class =& load_class('a','b'); 我们都知道其中的'&'是指引用,但是它的作用是什么呢?它能够解 ...

  8. C++命名空间、函数重载、缺省参数、内联函数、引用

    一 .C++入门 1.C++关键字 2.命名空间 3.C++输入&输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 8.auto关键字 9.基于范围的for循环 10.指针空值null ...

  9. 数据结构和算法(Golang实现)(2)简单入门Golang-包、变量和函数

    包.变量和函数 一.举个例子 现在我们来建立一个完整的程序main.go: // Golang程序入口的包名必须为 main package main // import "golang&q ...

随机推荐

  1. 粗粒度(Coarse-grained)vs细粒度(fine-grained)

    在读的一篇文献中关于RDF的描述: As we know, RDF data is a set of triples with the form (subject, property, object) ...

  2. solrserver实例化

    以下是httpClient实例化方式,需要tomcat运行Solr服务 1.ConcurrentUpdateSolrServer实例化SolrServer,该类实例化多用于更新删除索引操作 Concu ...

  3. 刷题向》关于一道奇怪的贪心(田忌赛马)BZOJ1034(NORMAL-)

    这道题一看就是一道贪心,比较简单,但是越容易的题考试的时候越容易错... 没什么好说的,一遍SORT之后,直接强行田忌赛艇(滑稽脸)就好啦. 注意在对比大小的时候不仅要从前还要从后同时,不过这两个情况 ...

  4. Angular27 指令

    1 自定概述 2 自定义指令 详情参见<揭秘Angular2> 2.1 属性指令 >工具代码 <div class="panel panel-primary" ...

  5. VS2013中全局属性与局部属性的设置

    为了更好的体现程序与库的独立性,vc++2013 中库路径设置不再采用全局设置,就是说在每个工程中都可以有自己独立的库路径设置,当然你如果不设置,那默认就是vs2013自己的库路径.但是如果你需要用到 ...

  6. 4.python 系统批量运维管理器之paramiko模块

    paramiko paramiko是ssh服务最经常使用的模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. paramiko实现ssh2不外乎两个角度:SSH客户端与服务端 SS ...

  7. PrintDocument or PrintPreviewDialog 打印

    /// <summary> /// /// </summary> /// <param name="sender"></param> ...

  8. mysql5.6数据库双机热备、主从备份

    主题:mysql5.6数据库双机热备.主从备份 缘由: 在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一.尤其是在大规模系统中,数据库集群已经成为必备的配置之一.集群的好处主要有:查询 ...

  9. Azure SQL作業

    由於要定期去刪除比較久的資料,礙於Azure SQL DB目前無法直接創建作業,目前找到一種方式就是通過local的SQL SERVER來執行AZURE SQL指令. 步驟如下: SQL Server ...

  10. asp.net微信内置浏览器下Session失效

    问题记录:仅限安卓端微信内置浏览器,服务器集群设置了黏性Session,在Post请求时会强制走代理,导致出去的ip指向另一台服务器,黏性Session失效,用户状态无法保存. 目前想知道除了设置Se ...