C++中的临时变量

来源:互联网 发布:最好的收音机软件 编辑:程序博客网 时间:2024/05/29 04:58
        临时变量,说到这个词很多开发的人应该都知道,但是却有很多人并不是真正具体的理解临时变量,很多人提到临时变量想到的都是我们在一个函数中自己临时创建的变量,我们认为那个我们临时创建的变量就是临时变量,但是其实这是一个很大的误区,我们自己临时创建的变量其实并不是临时变量,而是一个短期的局部变量,虽然我们自己感觉只是临时使用。

       那什么才是真正的临时变量呢,临时变量又是什么时候使用的呢?下面来简单介绍一下我对临时变量的一些理解,下面的介绍有很多是经过网上查询了解所得,如有误,请勿见怪。

       临时变量就上我们上面说的并不是我们临时创建的变量,而是,由编译器在程序需要的时候自动生成的临时性变量,它们并不在代码中出现,但是它们又是确实存在的,而临时变量的生成时机通常是在函数参数传递时发生类型转换,以及函数返回值时被创建。例如下面这个例子:

void Fun(short &s)
{

       cout << "Fun" << endl;

}

void FunCon(const short &s)

{

       cout << "FunCon" << endl;

}

int main()

{

       int iTest = 20;

       Fun(iTest);//error

       FunCon(iTest);//ok,iTest是一个int变量,但是函数参数为short型的常量引用,这时系统就会产生一个short型的临时变量

       return 0;

}

       上面的例子中我们定义了两个函数,两个函数猛一看好像差不多,但是仔细看会发现两个函数唯一的不同就在于两个函数的形参一个是非const引用,而一个是const引用,这一点微小的差别却导致了上面程序一个函数能够运行成功,而一个是不行的,这是为什么呢,仅仅差了const而已罢了,但是就是这一个const确实天差地别。

这里就牵扯到两点了,第一点、编译器对待临时变量的态度,即临时变量作为引用参数传递时编译器是怎么处理的呢,第二点、const引用与非const引用在此的使用。

       我们首先说一下第一点,很多人对第一点的理解是临时变量是常量,所以不允许复制,改动,所以当用作非常量时就会报错,这个理解在我们上面的问题上确实能够解释清楚,所以有人就会说既然能够解释上面的问题那不就是说上面的解释是对的了,但是这样理解实际上是不够准确的,临时变量实际上是可以作为左值的,这点在Thinking in C++的第一卷中的7.3节是有介绍的,所以如果说临时变量时常量,此处却有解释不清楚了,所以临时变量不能作为非const引用参数,并不是因为临时变量是常量,而是因为C++编译器的一个关于语法的限制,如果一个参数是以一个非const引用传入的,那么C++编译器就有理由相信我们传入的参数是可以在函数中修改的,并且这个修改的变量还是在函数外也是可以使用的,但是如果我们把一个临时变量当成非const引用参数传进来,则由于临时变量的特殊性,程序员是不能操作临时变量的,而且临时变量在使用完成后会释放,所以如果我们修改一个临时变量实际上没有意义的,所以C++编译器就加入了临时变量时不能作为非const引用的这个语意限制的,主要是限制这个非常规的用法的潜在错误。

       然后我们再说下第二点,即const引用与非const引用在此的使用,这一点其实我在上次讲引用的时候是说过了的,这里就再简单说一下,非const引用只能指向非const同类型的对象,但是const引用可以初始化为不同但相关的类型的对象或者初始化为右值。

      所以由上面的介绍,临时变量实际上并不是const变量,只不过是编译器的一种语意限制,只不过是编译器安全性限制。