const 常引用与const reference生命周期延长
常引用
使用const修饰符也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被更新。其定义格式如下:
const <类型说明符> & <引用名>
例如:
const double & v;
在实际应用中,常指针和常引用往往用来作函数的形参,这样的参数称为常参数。
#include <iostream>
using namespace std;
class A
{
public:
A(int i);
void print();
const int &r;
private:
const int a;
static const int b;
};
const int A::b=10;
A::A(int i):a(i), r(a)
{
}
void A::print()
{
cout<<a<<":"<<b<<":"<<r<<endl;}
void main()
{
A a1(100), a2(0);
a1.print();
a2.print();
}
该程序的运行结果为:
100:10:100
0:10:0
在该程序中,说明了如下三个常类型数据成员:
const int & r;
const int a;
static const int b;
其中,r是常int型引用,a是常int型变量,b是静态常int型变量。
按标准规定,临时对象可以被const reference,这里临时对象的生命期将延长。而延长对象生命期的方法没有作规定,由编译器决定。
TC++PL中的描述:
A temporary created to hold a reference initializer persists until the end of its reference’s scope.
注意到这里只是references scope,所以当该引用出了定义的范围,该临时变量就析构了。这并不违反临时变量生存期的定义,它已经被视为const变量了。
/* For example*/
#include <iostream>
using namespace std;
int get(){
int n = 10;
return n;
}
int main(){
const int & n= get();
cout<<n<<endl; // 10, fine。
return 0;
}
//No warnning,No error!
对于非const返回时候,是行不通的。
关于返回值转型为返回类型与析构临时变量的先后顺序,附:
//3.
//Call: A c = returnA(1,1);
//Result:
// A(int)
// ~A()
//Reason: 本来与4一样的结果,但编译器进行了优化
//
A returnA(int,int)
...{
return A(300);
}
//4.
//Call: A d = returnA(1,1,1);
//Result:
// A(int)
// A(A)
// ~A()
// ~A()
//Reason: 当d作用域完毕,析构函数
//
A returnA(int,int,int)
...{
A a(400); //构造函数A(int)
return a; //拷贝构造函数A(A),析构函数
}
评论
暂无评论添加评论
分类
琐碎文字 As3&Flex RIA UG English CodingArt C++ PHP Webserver E音乐盒 Unity3d C# JS&Html5 Tools mobile golang 最近发表
- js的锁以及异步调用相关(2024年11月30日 10:58:51)
- golang学习之函数/方法/接口(2022年1月6日 17:50:24)
- golang学习之零值(2022年1月6日 16:38:10)
- hello, 2018(2018年1月15日 22:47:25)
- 字体类型名词解释(2015年1月18日 11:29:14)
- 获取mysql表注释以及列注释(2014年11月13日 15:56:32)
- php连接ms sql数据库的一些问题(2014年9月15日 20:32:14)
- virtualbox虚拟网络:NAT&bridge桥接网络(2014年8月25日 22:51:35)
- php图片加水印(2014年8月15日 22:50:42)
- windows查看端口占用情况(2014年7月31日 21:19:30)
最近回复