临时对象的来源

一、临时对象的来源主要有两个,一个是传递参数的时候进行隐式转换,另外一个是函数返回对象时候

隐式转换:

void f(string& temp);

char a[]={abcd"};

f(a);

在这里会报错,因为a是char*类型,把一个char*类型转换为string类型中间需要一个临时变量,临时变量把char*转换成string,然后赋值给temp,但是因为修改temp就会修改这个临时变量,但却不会修改a,因此这样做是没有任何意义的,所以编译器不允许临时变量被修改,故这样做是错误的,可以给参数加个const,确保在函数内不会改变变量,这里举这个例子是为了说明这样的过程就会产生临时变量,也导致效率问题,因此应尽量避免这种隐式转换带来的效率问题

 

二、函数返回对象时候

A a(){...;return *this;}
会调用拷贝构造函数和析构函数
A& a(){...;return *this;}
不会调用拷贝构造函数和析构函数
应该都能够作为左值

 

当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝,你可以将引用看作是一个变量的别名,就是其他的名字,引用和被引用的变量其实是一个东西,只是有了两个名字而已。

问题的关键是,当你想要返回一个引用而不是一个拷贝时,你要确保这个引用的有效性,比如:
int & fun() { int a; a=10; return a; }
这样是不行的,因为a会在fun退出时被销毁,这时返回的a的引用是无效的。
这种情况下,如果fun的返回类型不是int & 而是int就没有问题了。

因此,要返回一个引用时,“临时变量”不能是“临时”的,至少得等函数外部使用完毕这个引用之后,才能销毁它。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值