C++ 关于const引用的测试

  今天学习了《C++ primer》第五版中的const相关内容,书中关于const的部分内容如下:

由书中内容(P55~P56)可知,const引用有如下几种常见例子:

第一种:

int i=10;
const int &r1=i; //输出r1=10
i=20;
cout<<r1; //输出r1=20
此时const引用r1是变量i的引用,对r1不可进行修改赋值等操作,但是我们可以修改变量i已达到间接修改r1的目的,其原因是r1是一个const引用,const类型不允许进行修改,而i是一个普通int型变量,可进行赋值操作。

第二种:

double d=10.1234;
const int &r2=d; //输出r2得到10
d=11.1234;
cout<<r2; //输出r2得到10
此时修改d的值对r2没有任何影响,因为const引用r2并没有绑定到变量d上面,其原因主要是r2是const int&型的引用,而右边的一般表达式中存在双精度浮点型变量,为保证r2能够得到一个浮点型,编译器将代码修改为如下:
double d=10.1234;
int temp=d;
const int &r2=temp; //输出r2得到10
d=11.1234;
cout<<r2; //输出r2得到10
所以其实常量引用r2是绑定到了一个临时创建的未命名变量上
(上述temp应该只是随便取的名,编译器中不一定是这个)
所以后续对浮点型变量d的修改都不影响r2的值。

第三种:

int j=10;
const int &r3=2*j; //输出r3=20
j=20;
cout<<r3; //输出r3=20
const int &r4=30; //输出r4=30
《C++ primer》中并没有详细讲解这种情况,按理说引用应该是绑定到某个对象上,这种初始化方式并没有固定的对象,但结合上述对同样没有具体对象的一般表达式的讲解,推测也是绑定到了某个编译器生成的临时变量上。

C++ 关于const引用的测试的更多相关文章

  1. const引用和函数占位参数遇上默认参数以及内联函数

    1.const引用: 但是加上const之后是可以的,const int &a=100;就不会报错了. 2.函数占位参数: 如果给最后的占位参数加上默认值: 3.内联函数 内联只是对编译器发起 ...

  2. C++ Const引用详解

    (1)       在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival ...

  3. 【c++基础】const、const指针、const引用

    一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) ; co ...

  4. 传const引用代替传值

    1.为什么使用传const引用? a.被调方法中,形参不再进行copy构造,以及析构,提高效率. b.传值,会出现对象切割的问题. 2.有没有例外? 在编译器底层,引用是使用指针实现的.这就意味着,如 ...

  5. const引用

    在C++中可以声明const引用 const Type& name = var: const引用让变量拥有只读属性 const int &a = b const int &a ...

  6. c/c++ 拷贝控制 右值与const引用

    拷贝控制 右值与const引用 背景:当一个函数的返回值是自定义类型时,调用侧用什么类型接收?? 1,如果自定义类型的拷贝构造函数的参数用const修饰了:可以用下面的方式接收. Test t2 = ...

  7. C++引用和const引用、常量指针、指针常量

    1.引用.常量引用 引用主要被用做函数的形式参数--通常将类对象传递给一个函数. 引用在内部存放的是一个对象的地址,它是该对象的别名.引用不占用内存,因为取地址引用的值和被引用变量的地址相同.但是ob ...

  8. const引用返回值

    一.引用 引用是别名 必须在定义引用时进行初始化.初始化是指明引用指向哪个对象的唯一方法. const 引用是指向 const 对象的引用: ; const int &refVal = iva ...

  9. 非const引用参数传入不同类型编译不过的理解(拒绝将临时对象绑定为非const的引用的形参是有道理的)

    int f (int & I) { cout<<I<<std::endl; } void main() { long L; f(L); // 编译不过 f((int)L ...

随机推荐

  1. nodejs启动

    npm install cnpm install npm run dev cnpm install 与 npm install :  https://blog.csdn.net/meng_suiga/ ...

  2. daily plan -- 2019/5/20

    1.课内作业:物联网工程导论论文. 2.实验项目计划:学习Kinect彩色帧读取. 3.算法:LeetCode 动态规划一题. 4.英语:听力30分钟训练,英语单词. 今日心情: 进度反馈:计划基本完 ...

  3. Codeforces 1093C (思维+贪心)

    题面 传送门 题目大意: 有一个长n(n为偶数)的序列a 已知a满足 \(a_1≤a_2≤⋯≤a_n\) 给出一个长度为\(\frac{n}{2}\) 的序列b,定义\(b_i=a_i+a_{n-i+ ...

  4. sqlserver创建索引语句

    CREATE INDEX PersonIndex ON 表名 (字段名)   DROP INDEX PersonIndex ON 表名

  5. mint/ubuntu Android Eclipse ADT 简单安装及执行崩溃解决的方法

    1. 下载 Android SDK(ADT Bundle)     http://developer.android.com/sdk/index.html     (站点訪问不了或者慢.请參考:轻松改 ...

  6. ELK + Filebeat日志分析系统安装

    之前搭建过elk,用于分析日志,无奈服务器资源不足,开了多个Logstash之后发现占用内存过高,于是现在改为Filebeat做日志收集,记录一下搭建过程和遇到问题的解决方案. 第一步 , 安装jdk ...

  7. JVM分为哪些区,每一个区干嘛的?

    程序计数器PC 线程私有的 它可以看做是当前线程所执行的字节码的行号指示器 内存区域中唯一一个没有规定任何OutOfMemoryError的区域 Java虚拟机栈 线程私有的 每个方法在执行的同时都会 ...

  8. python基础:7.求结果

    求结果: v1 = 1 or 3
 v2 = 1 and 3
 v3 = 0 and 2 and 1 v4 = 0 and 2 or 1 v5 = 0 and 2 or 1 or 4 v6 = 0 o ...

  9. equals区别==

    来自:https://blog.csdn.net/m0_37721946/article/details/78405595 java中的数据类型,可分为两类: 1.基本数据类型 byte,short, ...

  10. centos 6.5 切换用户

    root --> user,无需密码 su username user --> root,需要 root 密码 su root root 可省略