C++临时变量

为什么写这篇文章?

我在学习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    )
{
......
}

我掌握的就这么多啦,谢谢您看完了这篇文章,有什么错误或者问题,欢迎随时私信我或者留言。

少年没有乌托邦,心向远方自明朗!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发尚存的猿小二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值