本博客将讲述我学习过程中对临时变量的疑惑与理解
为什么写这篇文章?
我在学习C++过程中,发现C++在发生隐式转换时或者出现未命名的变量如字符串再或者在求值的时候,会出现C++临时变量(系统自动生成),而这个临时变量往往会那么C++临时变量有什么特性呢?下面我们探讨一下(毕竟我也是初学者,如果有错误,请大家多多担待)
注意我们在这里说的临时变量,不是平常函数里我们自己建立的变量(如swap函数里的temp)。这里说的临时变量是指系统自己产生的临时储存的变量(不可见)。
一.什么情况下会产生临时变量?
1.在使用运算符时
C++编译器会自动为表达式的求值结果生成一个临时变量。
//定义两个变量
int a =3,b=4;
//求和时会生成一个临时变量作为中间变量
int c = a + b;
2.在使用拷贝构造函数时
C++编译器会在创建对象的过程中生成临时变量
//定义了一个类
class A
{
public:
//定义了拷贝构造函数
A(const A & a){}
};
//生成临时变量
A a1;
A a2(a1);
3.当将一个非class类型的变量传递给函数时
C++编译器会给该变量创建一个临时变量
//定义一个函数
void func (int a)
{
cout<<a<<endl;
}
//调用函数时会生成一个临时变量
func(10);
二.临时变量有什么特性?
大家先看一段代码
void print(string & str)
{
cout<<str<<endl;
}
//这样调用是错误的
print("hello world");
系统提示:
意思是临时变量无法为非 const 引用初始化。出错的原因是编译器根据字符串 “hello world” 构造一个 string 类型的临时对象,这个临时变量具有 const 属性,当这个临时变量传递给非 const 的 string& 引用类型时,无法隐式完成 const 到非 const 的类型转换,便出现上面的编译错误。解决办法是将 print() 函数的参数改为常引用。
void print(const string& str)
{
cout<<str<<endl;
}
// 编译通过
print("hello world");
这样就能编译通过啦
以上可以总结为:
1.函数以 引用 作为形参时:不可以接受常量作为实参传递;
2. 函数以常引用作为形参时: 可以接受常量或变量作为实参传递。
所以在用引用做参数时尽量用常引用。
首先临时变量不是常量,但是临时变量不能传递给非const使用(编译器的缘故),在这个方面和常量一样,所以说临时变量有常性,其实只能说在这个方面有常性。
但是:绝大多数资料上显示临时变量有const性,所以我们认为临时变量都被const修饰
有些函数参数后加const ,表示传递的参数是const。
void func( )const
{
......
}
//与下面一样
void func(const )
{
......
}
少年没有乌托邦,心向远方自明朗!
如果这个博客对你有帮助,给博主一个免费的点赞就是最大的帮助❤
欢迎各位点赞,收藏和关注哦❤
如果有疑问或有不同见解,欢迎在评论区留言❤
后续会继续更新大连理工大学相关课程和有关C++的内容和代码
点赞加关注,学习不迷路,好,本次的学习就到这里啦!!!
我们下次再见!