转 C++的常量引用
C++的常量引用
关于引用的初始化有两点值得注意:
(1)当初始化值是一个左值(可以取得地址)时,没有任何问题;
(2)当初始化值不是一个左值时,则只能对一个const T&(常量引用)赋值。而且这个赋值是有一个过程的:
首先将值隐式转换到类型T,然后将这个转换结果存放在一个临时对象里,最后用这个临时对象来初始化这个引用变量。
例子:
double& dr = 1; // 错误:需要左值
const double& cdr = 1; // ok
第二句实际的过程如下:
double temp = double(1);
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));
}
通过常量引用从函数返回一个局部对象:
一般从一个函数返回一个局部对象的引用是不对的:
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 ();
总之,常量引用语法上可以引用一个临时变量。这种方法在使用引用作函数参数和返回局部变量时有意义。
我目前看来常量引用主要用在作函数参数或保证不修改原变量的时候。
一些参考:
http://topic.csdn.net/u/20080123/13/33c140ff-e213-417c-9d13-e672de4d9939.html
http://msdn.microsoft.com/zh-cn/library/cfbk5ddc.aspx
http://topic.csdn.net/t/20050209/18/3780754.html
...
转 C++的常量引用的更多相关文章
- 常量函数、常量引用参数、常量引用返回值[C++]
1. 关于常量引用正像在C语言中使用指针一样,C++中通常使用引用 有一个函数... foo()并且这个函数返回一个引用...... & foo()...., 一个指向位图(Bitmap)的引 ...
- C++ —— 非常量引用不能指向临时对象
目录 举例 分析 解决 1.举例 非常量引用 指向 临时对象 —— 即:将 临时对象 传递给 非常量引用类型. 如以下情况就会出现: 实现实数Rational类,实数可以使用+号相加,运算的结果要可以 ...
- C++ 非常量引用无效
/* 非常量引用无效 */ #include <iostream> using namespace std; /* C++标准的规定:非常量的引用不能指向临时对象: 为了防止给常量或临时变 ...
- 常量引用 const T&
1.引用本身不是对象,只是引用对象的别名,没有内存空间产生 2.引用必须严格类型匹配 3.而常量引用 const T& 可以引用字面值常量及表达式 其实也就是右值,且常量引用的不同与T类型对象 ...
- 【C/C++】引用&的含义/语法/作为函数参数/函数返回值/本质/常量引用
含义 引用不产生副本,只是给原变量起了别名. 对引用变量的操作就是对原变量的操作. 基本语法 数据类型 &别名 = 原名 e.g. int a = 10; int &b = a; // ...
- c++对c的拓展_常量引用
常量引用:不能通过引用去修改引用所指向的内容 const int &ref =val; // const int *const ref =&val; 注意:可引用常量 (普通引用无法 ...
- 推荐形参使用常量引用:void func(const T &);
一.声明为const的原因: 把函数不会改变的形参定义成普通的引用会带给函数的调用者一种误导,即函数可以修改它的实参的值: 限制函数所能接受的实参类型,如不能把const对象.字面值或者需要类型转换的 ...
- c++产生非常量引用的初始值必须是左值
出现这种情况是因为调用函数的形参类型是 T&(T为某一类型),该类型与调用参数值传入不一致,比如函数中形参是int型,而传入实参是double,存在隐式类型转化,系统会自动产生临时变量tem ...
- const函数返回自身的引用也是常量引用
const函数返回自身的引用也是const 解决:根据对象是否为consr重载
随机推荐
- linux正则表达式基础部分
1.什么是正则表达式? 简单的说,正则表达式就是为处理大量的字符串而定义的一套规则和方法, 例如:假设“@”代表boy,“!”代表girl.echo“@!” === “boygirl” 通过定义的这些 ...
- nodejs源码—初始化
概述 相信很多的人,每天在终端不止一遍的执行着node这条命令,对于很多人来说,它就像一个黑盒,并不知道背后到底发生了什么,本文将会为大家揭开这个神秘的面纱,由于本人水平有限,所以只是讲一个大概其,主 ...
- windows环境下安装npm、cnpm、bower
什么是npm.cnpm.bower? 简单地说,就是帮你下载好你需要的css或者js库,而且三者功能也都是一样的.那为什么要下载这3个不同的呢?据说npm容易被墙……而cnpm是淘宝的镜像,所以通常用 ...
- 关于PHPExcel导出Excel时身份证,数字会导出为科学计数的处理方法
上次在开发一个项目时,用到PHPExcel导出数据,其中有导出身份证等长串数字时导出的Excel中显示为科学计数方式. 这种显示很不人性化而且量多了修改起来也很麻烦. 这是因为Excel处理数字里默认 ...
- 学习pytho第五天 循环
age_of_Bob = 56#定义年龄 count = 0#头部计数 while True:#while循环 if count ==3:#如果次数==3: break#退出 guess_age = ...
- kuangbin 最短路集合
Til the Cows Come Home poj-2387 #include<iostream> #include<cstdio> #include<algorith ...
- HashTable, HashMap,TreeMap区别
java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类.Map是将键映射到值的对象,一个映射不能包含重复的键:每个键最多 ...
- CodeForces 768E Game of Stones 打表找规律
题意: 在经典Nim博弈的基础上增加了新的限制:如果从这堆石子中移走\(x\)个石子,那么之后就不能再从这堆移走\(x\)个. 分析: 因为之前的操作会对后面的转移有影响,所以在保存状态时还要记录哪些 ...
- java包、类、方法、属性、常量命名规则
必须用英文,不要用汉语拼音 1:包(package):用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作为包名.比如www.sohu.com 对于包名:每个字母都需 ...
- python 学习分享-常用模块篇
模块 就是前人给你造的轮子,你开车就好!!! 常用模块有: time模块 random模块 os模块 sys模块 shutil模块 json & picle模块 shelve模块 xml处 ...