zoukankan      html  css  js  c++  java
  • 对const的引用(常量引用)

      引用的类型必须与其所引用对象的类型一致.但是,对const的引用是第一种例外情况.

      对const的引用,常简称为"常量引用". 常量引用的初始值可以是任意表达式,只要该表达式的结果能转换成引用的类型即可.

      但是,对于字面值,一般表达式以及与常量引用类型不一致的对象作为常量引用的初始值,常量引用实际绑定到了临时变量上.测试代码如下:

     1 #include <iostream>
     2 
     3 int main()
     4 {
     5     int i = 42;
     6     int &r1 = i;
     7 
     8     const int &r2 = i;
     9     std::cout << "r2 = " << r2 << std::endl;
    10     r1 = 40;
    11     std::cout << "r2 = " << r2 << std::endl;//测试r2是否改变.
    12 
    13     const int &r3 = i * 2;
    14     std::cout << "r3 = " << r3 << std::endl;
    15     r1 = 30;
    16     std::cout << "r3 = " << r3 << "    i = " << i << std::endl;//测试r3是否改变.
    17 
    18     std::cout << "Double===========================" << std::endl;//测试r3是否改变.
    19 
    20     double val = 3.14;
    21     const int &r4 = val;
    22     std::cout << "r4 = " << r4 << std::endl;
    23     val = 5.2;
    24     std::cout << "r4 = " << r4 << "     val = " << val << std::endl;//测试r4是否改变.
    25 
    26 
    27     double val_2 = 2.1;
    28     const double &r5 = val_2 * 2;
    29     std::cout << "r5 = " << r5 << std::endl;
    30     val_2 = 9.35;
    31     std::cout << "r5 = " << r5 << "   val_2 = " << val_2 << std::endl;//测试r5是否改变.
    32 
    33 
    34 
    35     const int val_3 = 3;
    36     const double &r6 = val_3;
    37     std::cout << "r6 = " << r6 << "     val_3 = " << val_3 << std::endl;//测试r6是否改变.
    38 
    39     return 0;
    40 }

      运行结果如下:

     

      可以看出对于一般表达式,常量引用绑定到临时变量上.对于上述最后一种情况,分析r6也只能绑定到临时量上.

        最后总结一下.常量引用只有2种情况会绑定到实际的对象:一是常量引用的初始值为const对象,且该对象类型与常量引用类型相同(如const int i ; const int &r = i;);二是常量引用的初始值为非const对象,且该对象也与常量引用类型(除去const的类型)相同(如int i; const int &r = i;).测试代码中,r2的情况即是如此.这种情况下,绑定的非const对象内容可以用其他普通引用改变.    

    不是尽力而为,而是全力以赴.
  • 相关阅读:
    Linux内核学习笔记(6)-- 进程优先级详解(prio、static_prio、normal_prio、rt_priority)
    Cuteftp连接虚拟机Centos7
    Linux内核学习笔记(5)-- 进程调度概述
    Linux内核学习笔记(4)-- wait、waitpid、wait3 和 wait4
    Linux内核学习笔记(3)-- 进程的创建和终结
    Linux内核学习笔记(2)-- 父进程和子进程及它们的访问方法
    Linux内核学习笔记(1)-- 进程管理概述
    汇编基础--标识符、标号、伪指令和指令
    JAVA学习笔记--正则表达式
    JAVA学习笔记--字符串概述
  • 原文地址:https://www.cnblogs.com/yang666/p/6546966.html
Copyright © 2011-2022 走看看