zoukankan      html  css  js  c++  java
  • c++入门之引用

    引用通常被用在函数形参传递的过程中。一般的参数传递的过程:将实参进行拷贝,函数中都是对拷贝的变量进行操作,而不是对原变量进行操作。但很多情况下,我们都希望对原变量进行操作.(比如交换两个变量的数值)。下面先给出一段代码:

     1 #include "iostream"
     2 #include "string"
     3 using std::string;
     4 using std::cout;
     5 struct free_throws{
     6     string name;
     7     int made;
     8     int attempts;
     9     float percent;
    10 };
    11 
    12 void display(const free_throws &ft);
    13 void set_pc(free_throws &ft);
    14 free_throws& accmulate(free_throws &target, const free_throws &source);
    15 
    16 int main()
    17 {
    18     free_throws one{ "alice", 13, 14 };
    19     free_throws two{ "jack", 10, 16 };
    20     free_throws three{ "robot", 7, 9 };
    21     free_throws four{ "lucy", 5,9 };
    22     free_throws five{ "jeff", 6, 14 };
    23     free_throws team{ "lee", 0, 0};
    24     free_throws dup;
    25     set_pc(one);
    26     display(one);
    27     accmulate(team, one);
    28     display(team);
    29     display(accmulate(team, two));
    30     accmulate(accmulate(team, three), four);
    31     display(team);
    32     system("pause");
    33     return 0;
    34 }
    35 
    36 void set_pc(free_throws &ft)
    37 {
    38     if (ft.attempts != 0)
    39         ft.percent = 100.0f*float(ft.made) / float(ft.attempts);
    40     else
    41         ft.percent = 0;
    42 }
    43 void display(const free_throws &ft)
    44 {
    45     cout << "name:" << ft.name << "
    ";
    46     cout << "made" << ft.made << "	";
    47     cout << "attempts" << ft.attempts << "	";
    48     cout << "attempts" << ft.percent << "	";
    49 }
    50 
    51 free_throws &accmulate(free_throws &target, const free_throws &source)
    52 {
    53     target.attempts += source.attempts;
    54     target.made = source.made;
    55     set_pc(target);
    56     return target;
    57 }

    上述代码:描述了引用变量在结构体中的应用,实际上,应用引用变量的地方多在较为复杂的数据结构中。

    1.set_pc()的功能是修改结构体成员值(如果我们不采用引用变量,那么修改的将是拷贝的变量,而非原变量,当然我们也可以采用指针的方式)

    2.display()的作用是显示结构体成员值,需要注意的是:这个程序的功能是显示结构体成员的值,也就是不对结构体成员作修改。因此引入了const 限定。const表明如果我们试图在函数函数中修改形参(这里是ft,也就是被传递的结构体,如one),那么就会出错。.

    关于const的基本性质和原理不再赘述。说明一点:当要被传递的参数作为右值时(不被修改),为了程序的健壮性,通常我们会将参数设置为const类型

    free_throws &accmulate(par1,par2)函数中的par1是被修改的,而par2是右值,因此定义成了const。但这个函数有趣的地方在于,帮我们重新认识了函数:思考什么是函数?

            从组成结构上讲,函数包括了这几个点:函数名(函数的入口地址),函数形参类型及个数,函数的返回值类型(函数名前面的东西)。当每次遇到函数的时候,我们脑海里要形成对这三个属性的认识:函数名代表什么,函数的形参可以是什么类型?可以有多少个?返回值是什么类型??可以有多少个?

    我们关注这个函数的返回值,发现,并不是我们熟悉的Int ,char ,double ,甚至是指针比如int *。这里返回的是结构体,确切的说是结构体引用。比如我们说指针类型的时候,我们会说int*.因此,我们需要将引用看成一个类型。这里是structname  &类型。而我们发现,target变量自身就是structname  &类型。我们发现,这是吻合的,其实仔细思考原来的,int ,char ,double 甚至指针,函数中被返回的变量的类型。和函数名前的返回类型是一致的!!!

    4  引用必须在定义的时候进行初始化,函数传参也属于这一种情况。

     

  • 相关阅读:
    koa2跨域模块koa2-cors
    使用spring等框架的web程序在Tomcat下的启动顺序及思路理清
    logback 配置解析
    java 学习总结
    如何删除git远程分支
    C++11 锁 lock
    CAS 与 无锁队列
    docker 配置
    vim 中Taglist的安装和使用
    基于C++11的线程池,简洁且可以带任意多的参数
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/9821062.html
Copyright © 2011-2022 走看看