临时变量是只在调用期间有效,具有常性的一种变量。
一、值传递
在返回值以值传递(传值和传指针)的形式返回时,会生成临时变量。
int sum(int a,int b)
{
return a + b;
}
编译器会将结果a+b的值拷贝给临时变量,最终返回的是临时变量;
二、具有引用类型
在函数调用中,如果形参是引用的类型的情况下:当实参和形参的类型不匹配会产生临时变量;
string foo();
void bar(string &s);
bar(foo());//非法,类型不匹配,生成临时变量,临时变量是const类型,而形参是非const类型
bar("Hello");//非法
如果形参是常引用类型:
当类型匹配,但不是左值,会产生临时变量;
当类型不匹配,但是可以转换为正确的类型时,会产生临时变量;
Double refcube(const double& ra)
{
Returnra*ra*ra;
}
double side = 3.0;
double* pd = &side;
double& rd = side;
long edge = 5L;
double lens[4]={2.3,3.4,4.5,6.7};
double c1 = refcube(side); // ra 是side
double c2 = refcube(lens[2]); // ra是lens[2]
double c3 = refcube(rd); // ra 是 rd
double c4 = refcube(*pd); // ra 是*pd
double c5 = refcube(edge); // ra 是临时变量
double c6 = refcube(7.0); // ra 是临时变量
double c7 = refcube(side+10.0); // ra 是临时变量
long类型和double类型不匹配,产生临时变量;7.0、side + 10.0与double类型相对应,但由于不是左值,也产生临时变量;这些临时变量只是在函数调用期间存在;
到这里可能会有一个疑问,既然被调函数的参数列表类型中加const和不加const都会产生临时变量,那为什么还要加const?
1、在有必要时产生临时变量,保证原始数据不被修改。
2、保证代码合法;如果没有const类型修饰,在类型不匹配时,在调用点会产生临时变量,就会尝试使const类型转换为非const类型,当然,这样是非法的;有const类型修饰的情况下产生临时变量,操作的也是临时变量;根本来讲,这一点也是为了保证原始数据不被修改。
三、强转类型转化
强转类型转化,一定有临时变量。
double a = 10.5;
cout << (int)a ;
cout << a;
输出:10和10.5
所以在强转时,一定生成临时变量,原始数据本身并没有改变。