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

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

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

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

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

例子:

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

第二句实际的过程如下:

double temp = double();
const double& cdr = temp;

作函数参数时:

// bc_temp_objects_not_bound_to_nonconst_ref.cpp
// compile with: /EHsc
#include "iostream"
using namespace std;
class C {};
void f(C & c) { cout << "C&" <<endl; }
void f(C const & c) { cout << "C const &" <<endl; }
int main() {
f(C());
}

结果:

C const &

更直接的,用基本类型:

#include <iostream>
using namespace std;
void display(int const &ref) {cout<<ref<<'\n';}
int main()
{
int i=;
display(i);
int const anotheri=;
display(anotheri);
display();
display(+);
display(static_cast<int>(3.14159));
}

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

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

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

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

const T & my_op ( void )
{
T t;
return t;
}
const T & my_t_obj = my_op ();

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

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

C++常量的引用 const的更多相关文章

  1. 对常量的引用(reference to const)的一般用途(转载)

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

  2. 常量引用 const T&

    1.引用本身不是对象,只是引用对象的别名,没有内存空间产生 2.引用必须严格类型匹配 3.而常量引用 const T& 可以引用字面值常量及表达式 其实也就是右值,且常量引用的不同与T类型对象 ...

  3. C++常量表达式、const、constexpr(C++11新增)的区别

    常量表达式是指值不会改变且在编译过程中就能够得到计算结果的表达式,能在编译时求值的表达式. 程序先编译再运行:  在编译阶段, 编译器将在编译过程中把用到该常量的地方都全都替换为 常量的值. 但是常量 ...

  4. 2018/03/08 每日一学PHP 之 常量defind 和 const区别

    常量defind 和 const区别 什么是常量? 如字面理解的,在脚本执行期间不可改变的的量. 定义一个常量应该注意的事项? 1:常量默认大小写敏感,错误的大小写不会被识别为常量. 2:常量只能是标 ...

  5. const(每个对象中的常量), static const(类的编译时常量)

    1 每个对象中的常量 --- const数据成员 const限定,意味着“在该对象生命周期内,它是一个常量”. 关键字const 使被限定的量为常量 在该类的每个对象中,编译器都为其const数据成员 ...

  6. 位运算+引用+const+new/delete+内联函数、函数重载、函数缺省参数

    update 2014-05-17 一.位运算 应用: 1.判断某一位是否为1 2.只改变其中某一位,而保持其它位都不变 位运算操作: 1.& 按位与(双目): 将某变量中的某些位(与0位与) ...

  7. 常量指针(const X*)和指针常量(X* const)

    const X* 类型的指针(指向常量的指针),此指针的地址是一个变量,是可以修改的:但其所指向的内容是常量,是不可以修改的. 例如: 1: char name[5] = "lisi&quo ...

  8. PHP中定义常量define与const

    我们通常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,也可减少团队开发的出错.那么define和const有什么区别呢? 1.const是一个语言结构:而define是一个函数 ...

  9. 在php中定义常量时,const和define的区别?

    使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很多. 1.const用于类成员变量的定义,一经定义,不可修改.Def ...

随机推荐

  1. 荷兰国旗问题 划分成3部分 leecode

    public class Solution { public void sortColors(int[] A) { int len=A.length; int beg=0; int end=len-1 ...

  2. android camera(一):camera模组CMM介绍

    一.摄像头模组(CCM)介绍: 1.camera特写 摄像头模组,全称CameraCompact Module,以下简写为CCM,是影像捕捉至关重要的电子器件.先来张特写,各种样子的都有,不过我前一段 ...

  3. Yii学习系列:Yii视频讲义——前篇(转)

    1.yii的网址 http://www.yiiframework.com/ yii官方网址 http://www.yiichina.com/ yii中文社区 2.bootstrap的网址 http:/ ...

  4. uvaoj 10397 - Connect the Campus【最小生成树】

    uvaoj 10397 - Connect the Campus Many new buildings are under construction on the campus of the Univ ...

  5. 通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法

    在用本地的navicat连接服务器的mysql数据库时候出现下面的问题: 解决的方法: 解决方法: 1.改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhos ...

  6. Bulk Insert命令具体

    Bulk Insert命令具体 BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ...

  7. [Javascript] Immutable opreators

    slice filter map ...spread concat Object.assign let items = [1,2,3]; //add let newItems = [...items, ...

  8. JSP内置对象整理(转)

    ① out - javax.servlet.jsp.jspWriter out对象用于把结果输出到网页上. 方法: 1. void clear() ;清除输出缓冲区的内容,但是不输出到客户端. 2. ...

  9. bash手册 之重定向原理与实现

    http://www.gnu.org/software/bash/manual/bashref.html#Redirections http://www.cnblogs.com/weidagang20 ...

  10. Performing a thread dump in Linux or Windows--reference

    Linux/Unix 1. Find the Java/Tomcat process id. % ps ax | grep java You should see output like this 1 ...