【C++】什么情况下会产生临时变量

临时变量是只在调用期间有效,具有常性的一种变量。

一、值传递

在返回值以值传递(传值和传指针)的形式返回时,会生成临时变量。

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

所以在强转时,一定生成临时变量,原始数据本身并没有改变。

猜你喜欢

转载自blog.csdn.net/QX_a11/article/details/89643492