C++常量引用正确应用方法

开发 后端
C++常量引用的操作,首先需要建立一个临时变量。具体的操作方法将会在这篇文章中为大家详细介绍。希望能给大家带来一些帮助。

C++编程语言中,对于常量的引用是一个非常重要的应用技巧。在这篇文章中,我们将会为大家详细介绍一下有关C++常量引用的相关应用方法,相信大家可以从中学到很多知识。#t#

如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作。对C++常量引用可以用其它任何引用来初始化;但不能改变。

关于引用的初始化有两点值得注意:

(1)当初始化值是一个左值(可以取得地址)时,没有任何问题;

(2)当初始化值不是一个左值时,则只能对一个const T&(常量引用)赋值。而且这个赋值是有一个过程的:

首先将值隐式转换到类型T,然后将这个转换结果存放在一个临时对象里,***用这个临时对象来初始化这个引用变量。

例子:

 

  1. double& dr = 1; // 错误:需要左值  
  2. const double& cdr = 1; // ok 

 

第二句实际的过程如下:

 

  1. double temp = double(1);  
  2. const double& cdr = temp

 

 

作函数参数时:

 

  1. // bc_temp_objects_not_bound_to_nonconst_ref.cpp  
  2. // compile with: /EHsc  
  3. #include "iostream"  
  4. using namespace std;  
  5. class C {};  
  6. void f(C & c) { cout << "C&" << endl; }  
  7. void f(C const & c) { cout << "C const &" << endl; }  
  8. int main() {  
  9. f(C());  

 

结果:

C const &

更直接的,用基本类型:

 

  1. #include <iostream> 
  2. using namespace std;  
  3. void display(int const &ref) {cout<<ref<<'\n';}  
  4. int main()  
  5. {  
  6. int i=1;  
  7. display(i);  
  8. int const anotheri=2;  
  9. display(anotheri);  
  10. display(2);  
  11. display(1+2);  
  12. display(static_cast<int>(3.14159));  

 

通过C++常量引用从函数返回一个局部对象:

一般从一个函数返回一个局部对象的引用是不对的:
 

 

  1. T & my_op ( void )   
  2. {   
  3. T t;   
  4. return t;   
  5. } // The T object t got destroyed here so the 
    returned reference is not valid anymore.  

 

特殊情况:返回一个常引用

 

  1. const T & my_op ( void )   
  2. {   
  3. T t;   
  4. return t;   
  5. }   
  6. const T & my_t_obj = my_op ();  

 

在这个情况下,局部变量 t 不会被直接析构,而是会保留到 my_t_obj 的生命周期结束为止。

总之,C++常量引用语法上可以引用一个临时变量。这种方法在使用引用作函数参数和返回局部变量时有意义。我目前看来常量引用主要用在作函数参数或保证不修改原变量的时候。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-01 15:26:44

C++ inline函

2010-02-05 14:12:46

C++声明放置

2010-05-28 15:16:40

MySQL 资源

2009-12-07 14:38:14

PHP foreach

2010-03-04 14:02:51

Python大小写

2010-02-22 14:09:08

WCF Dispose

2010-05-25 18:01:35

linux MySQL

2010-05-28 19:20:36

MySQL mysql

2010-02-22 10:42:12

WCF Stream

2010-01-25 09:28:54

Android模拟器

2010-07-21 10:50:48

SQL Server存

2010-07-26 17:43:34

SQL Server

2011-03-30 17:20:18

C++引用

2010-03-05 15:01:29

Python解析XML

2010-03-03 17:58:16

Python同步队列

2010-08-18 16:45:40

IBM DB2 Cat

2021-07-02 16:13:01

区块链金融数据库

2010-01-25 11:29:33

Android计时器

2010-03-04 09:40:52

Python Clas

2010-03-04 13:30:11

Python file
点赞
收藏

51CTO技术栈公众号