zoukankan      html  css  js  c++  java
  • C++返回引用的函数

      要以引用返回函数值,则函数定义时的格式如下:

      类型标识符&类型名 (形参列表及类型说明)

      { 函数体 }

      用const限定引用的声明方式为:

      const 类型标识符&引用名=目标变量名;

      用这种方式声明的引用不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,保证了 引用的安全性。

      注意几点:

    • 要以引用返回函数值,则定义函数时需要在函数名前加上&。
    • 用引用返回一个函数值的最大好处是:在内存中不产生被返回值的副本;而用普通的返回值的方法返回一个函数的函数值时,需要在内存中先创建一个临时变量,在被调函数返回时,将函数值复制到该临时变量中,主调函数再以该临时变量的值进行运算。
    • 在引用的使用中,单纯给某个变量取个别名是毫无意义的, 引用的目的主要是在函数参数传递中解决大对象的传递效率和空间不如意的问题。
    • 用引用传递函数的参数能保证参数传递中不产生副本和提高传递的效率,且通过const的使用,又保证了引用传递的安全性。
    • 引用与指针的区别在于:指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作,程序中使用指针使程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
    • 一般情况下,赋值表达式的左边只能是变量名,即被赋值的对象必须是变量,因为孩子有变量才能被赋值,而常量或表达式不能被赋值,但如果一个函数的返回值是引用,则赋值号的左边可以是该函数的调用。

    本人自学,教材可能有点老,有问题的话求大家指正!!!谢谢!!!

    例题:

    • 定义一个普通的函数,使用返回值的方法返回函数值,定义另一个函数使用引用的方法返回函数值
     1 #include<iostream>
     2 using namespace std;
     3 
     4 
     5 int f1(int a);
     6 int &f2(int a);
     7 
     8 int f1(int a)
     9 {
    10     int num;
    11     num = a*10;
    12     return num;
    13 }
    14 
    15 int &f2(int a)
    16 {
    17     int num;
    18     num = a*20;
    19     return num;
    20 }
    21 
    22 int main()
    23 {
    24     int a,b;
    25     a=f1(1);
    26     b=f2(2);
    27     cout << f1(4) << endl;
    28     cout << f2(5) << endl;
    29     cout << a << endl;
    30     cout << b << endl;
    31     //int &ra=f1(3);    这种用法可能会出错,(不同C++系统有不同规定)
    32     int &rb=f2(3);
    33     cout << rb << endl;
    34     return 0;
    35 }
    • 使用返回引用的函数值作为赋值表达式的左值
     1 #include<iostream>
     2 using namespace std;
     3 
     4 int &put(int n); 
     5 int vals[10];
     6 int error=-1;
     7 
     8 
     9 int &put(int n)
    10 {
    11     if(n>=0 && n<=9)
    12         return vals[n];
    13     else
    14     {   
    15         cout << "error!" << endl;
    16         return error;
    17     }   
    18 }
    19 
    20 int main()
    21 {
    22     put(0)=10;
    23     put(9)=20;
    24     cout << vals[0] << endl;
    25     cout << vals[9] << endl;
    26     return 0;
    27 }
    • 使用const限定引用
     1 include<iostream>
     2 using namespace std;
     3 
     4 int &fn(const int &a) 
     5 {
     6     //a=32; 错误!不可以进行赋值
     7     int b=a;
     8     return b;   //如果返回a,也会报错
     9 }
    10 
    11 int main()
    12 {
    13     int &a = fn(32);
    14     cout << a << endl;
    15     return 0;
    16 }
    17 
    18 //菜鸟,求大家批评指教,代码编写习惯和规范等等!!!谢谢!!!

    本人自学,教材可能有点老,有问题的话求大家指正!!!谢谢!!!

  • 相关阅读:
    串行化数据读取类(WebService下DataSet的高性能替代类)源代码
    如何在Access2007中打开加密的Access2003数据库
    业务流程不是需求(ZT)
    XML文件的DOCTYPE定义(转)
    别让Hibernate偷走了您的身份(转)
    有关Struts标签<html:cancel>使用的一点提示
    Silverlight下实现Windows8风格的进度条
    DotNetMock单元测试的利器
    进入ubuntu终端的快捷键
    花生壳域名建站,内网能访问,外网不能访问的解决办法
  • 原文地址:https://www.cnblogs.com/MichaelBin/p/4552808.html
Copyright © 2011-2022 走看看