对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对象内容可以用其他普通引用改变.  

时间: 2024-11-08 21:56:37

对const的引用(常量引用)的相关文章

const常量引用的使用方法

C++编程语言中,对于常量的引用是一个非常重要的应用技巧.在这篇文章中,我们将会为大家详细介绍一下有关C++常量引用的相关应用方法,相信大家可以从中学到很多知识. C++单例模式基础内容详解 C++创建Web服务相关方法剖析 C++构造函数如何进行初始化 C++标识符命名规则相关应用技巧分享 C++函数模板基本概念讲述 如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作.对C++常量引用可以用其它任何引用来初始化:但不能改

常量引用 const T&amp;

1.引用本身不是对象,只是引用对象的别名,没有内存空间产生 2.引用必须严格类型匹配 3.而常量引用 const T& 可以引用字面值常量及表达式 其实也就是右值,且常量引用的不同与T类型对象时,如果可以类型转换则会类型转换为T类型常量引用,不过会产生临时变量(C++ Primer): code: double d=25.0; const int& a=d; implicit code: double d=25.0; const int temp=d; const int& a=t

引用专题(续)=》 常量引用

常引用分两点: 1 使用变量初始化const引用 const int &a = b 2 使用字面量常量初始化const引用  const int &m = 10: #include <iostream> using namespace std; void main() {     //普通引用     int a = 10;     int &b = a;     printf("b"%d\n",b);               //常引

const,指针与引用的关系

看完C++Primer第二章后,对于const,指针和引用以及后面的constexpr,auto之类的关系异常混乱,特此整理. 一.const必须初始化 const int i = 42; const int j = get_size(); 二.const 和 引用    1.常量引用(对常量的引用):将引用与一个常量对象绑定 const int ci = 42; const int &r1 = ci; 2.除此之外,允许一个常量引用绑定一个非常量的对象,字面值或表达式 int i = 42;

重载 与常量引用

void print(int a,int b,int =0){ cout<<"执行三个参数的"<<endl; } void print(int a,int b){ cout<<"执行两个参数的"<<endl; } //以上两个,在使用函数print(3,5);//error:ambiguous call to overloaded function void print(int a){//注意返回类型 cout<

C++ Primer 学习笔记_17_从C到C++(3)--引用、const引用、引用传递、引用作为函数返回值、引用与指针区别

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 一.引用 1.引用是给一个变量起别名 变量: 名称 空间 引用: 引用不是变量 引用仅仅是变量的别名 引用没有自己独立的空间 引用要与它所引用的变量共享空间 对引用所做的改变实际上是对它所引用的变量的改变 引用在定义的时候必须要进行初始化 引用一经初始化,不能重新指向其他变量 2.定义引用的一般格式: (1)类型  &引用名 = 变量名: (2)例如: int a=1; int &b=a; // b是a的别名,因此a和b是同一个单元 (3)

C++学习笔记与思考 --const限定符及其引用,typedef符号

1. 定义const对象 因为常量在定义后就不能被修改,所以在定义时必须进行初始化. const int bufSize=512; const int i; // error; i is uninitialized const 2. const 对象默认为文件中的局部变量 我们知道,如果我们在一个文件中定义了一个非const变量,如果我们想在另一个文件中使用这个变量,只需要在使用前添加extern 声明即可. file1.cpp int counter; // file2.cpp extern

C++ 常量引用与临时变量

由 <<C++ Primer>> 练习7.49 (b) 产生出来的小问题. 总结: 1.不要对临时变量进行改变.要传递临时变量,得用常量引用. 2. 当引用不需要更改时,用const引用. 问题: struct Sales_data { Sales_data() = default; Sales_data(std::string &str){} Sales_data& combine( Sales_data&); }; Sales_data& Sal

C++ 常量引用

普通引用为形参的函数,一般会更改实参的值:以常量以及常量引用为形参的函数,一般不对实参进行修改. 常量引用兼有常量和引用的优点.不会新创建一个变量然后进行拷贝,而是直接传对象,速度快,同时保证了在函数内部无法对对象进行修改. 通常,引用的类型必须和所引用的类型一致,但常量引用在类型不匹配时,编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作.普通引用则没有这样的过程. 这个过程的一个作用是让不匹配的类型隐式转换成需要的常量类型.一个典型的例子如下: