C++引用和函数的高级用法

函数

  1. 内联函数
  2. 重载函数
  3. 默认
  4. 递归函数

引用的概念

  • 引用的定义和初始化
  1. 引用是个别名
  2. 引用的初始化
  3. 引用作为目标的别名而使用,对引用的改动实际就是对目标的改动。
  4. 为了建立引用,先写上目标的类型,再加上引用运算符”&”,然后是引用的名字。
  5. 引用能引用任何合法变量名

引用的初始化

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
    int intone=5;
    int& rint=intone;
    cout<<"intone = "<<intone<<endl;
    cout<<"rint = "<<rint<<endl;
}
//结果为:intone=5;
//rint=5;

  1. 它们占用同一块内存
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
    int intone=5;
    int& rint=intone;
    cout<<"intone = "<<intone<<endl;
    cout<<"rint = "<<rint<<endl;
    rint=10;
    cout<<"intone = "<<intone<<endl;
    cout<<"rint = "<<rint<<endl;
    cout<<"&intone = "<<&intone<<endl;
    cout<<"&rint = "<<&rint<<endl;
}
//结果为: 5,5,10,10

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
    int intone=5;
    int& rint=intone;
    int inttwo=6;
    rint=inttwo;
    cout<<"intone = "<<intone<<endl;
    cout<<"rint = "<<rint<<endl;
    cout<<"inttwo = "<<intone<<endl;
    cout<<"&intone = "<<&intone<<endl;
    cout<<"&rint = "<<&rint<<endl;
    cout<<"&inttwo = "<<&inttwo<<endl;
}
//结果为:6,6,6,f0,f0,f4;

操作引用

  • &只有在声明引用时是引用操作符,其他时候都是地址操作符

引用的条件

  • 若一个变量声明为T&,即引用时,它必须用T类型的变量或对象,或能够转换成T类型的对象进行初始化。
 const double& rr=1; 
 
  1. 首先作必要的类型转换;
  2. 然后将结果置于临时变量;
  3. 最后,把临时变量的地址作为初始化的值
  • 由于指针也是变量,所以可以有指针变量的引用
 int*a:
  int*&P=a://表示int*的引用P初始化为a
  int b=8;
  P=&b://0k,P是a的别名,是一个指针

  • 什么不能引用
  1. 对void进行引用是不允许的。

例如:void&a=3; //error

  1. 不能建立引用的数组
    例如:int a[10];
    int& ra[10]=a; //error
 int a;
 int& ra=a;
 int& *p=&ra; //error企图定义一个引用的指针
 
int& ri=NULL; //毫无意义
nt& ra=int; //error初始化时用数据类型初始化了

用引用传递函数参数(传值,传地址)

  1. 引用作为形参
(传地址)
#include<stdio.h>
#include<iostream>
using namespace std;
void jxbswap(int &a,int &b)//int *a,int *b;两个*号同除以&则变为&
{
    int temp;
    temp=a;
    a=b;
    b=temp;
}
int main()
{
    int x=10,y=20;
    jxbswap(x,y);//原为&x,&y;同除以&,则为x,y;
    cout<<"x = "<<x<<endl;
    cout<<"y = "<<y<<endl;
}

  1. 引用作为返回值
  • 是有问题的

#include<stdio.h>
#include<iostream>
using namespace std;
int *swap()
{
    int temp=12;
    return &temp;//temp空间释放
}
int main()
{
    int *x=swap();//*x成为野指针
    cout<<"*x = "<<*x<<endl;
}

  • 利用引用,则不会有错
include<stdio.h>
#include<iostream>
using namespace std;
int &swap()
{
    int temp=12;
    return temp;//temp空间释放
}
int main()
{
    int &x=swap();//*x成为野指针
    cout<<"x = "<<x<<endl;
}
//结果为:12;

  • 使用引用作为参数和返回值给函数的意义
  1. 函数只能返回一个值。如果程序需要从函数返回两个值怎么办
  2. 解决这一问题的办法之一是用引用给函数传递两个参数,然后由函数往目标中填入正确的值
  3. 函数返回值时,要生成一个值的副本。而用引用返回值时,不生成值的副本,所以提高了效率
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容