c++中临时对象

* 今天看了c++发明人的the c++ programming language(special edition)关于临时对象的说明,虽然是一小节,
但感觉c++的书籍,论内容还是这本最权威,里面很多东西都直接确定的表达了出来,权威、确定而令人信服。

临时对象的生存时限在这本书中只花了不长的篇章,但说的很清楚,临时对象的生存时限 限制在其出现的“完整”的表达式
中,“完整”的表达式结束了,临时对象也就销毁了
。例外是把临时对象被引用或者初始化给具名对象,临时对象的生存周期
会加长到引用或者具名对象的生存周期。

底下的简短程序测试了临时对象的生存时限,vs2005很好的说明了临时对象在其“完整”表达式结束后销毁。
*/

#include <iostream>
#include <string>
using namespace std;

/* 打印 字符串 */
void print(const string& str)
{
cout << str.c_str() << endl;
}

/* 打印 字符串2 */
void display(string str)
{
cout << "xxxxxxxx" << endl;
cout << str.c_str() << endl;
cout << "xxxxxxxx" << endl;
}

int main()
{
string str1 = "xiaocui";
string str2 = ",nihao";
const char* s = NULL;

if ( s = (str1 + str2).c_str() ) //此处s1+s2产生一个临时string对象,它的生存周期是临时对象所出现的“完整”的表达式的生存周期
{
cout << s << endl; //上面的临时对象已经在其“完整”的表达式结束后析构了,那么s指向的那块内存已经不存在了,此处引用s是未定义的,危险的
}

string ss = str1 + str2; //str1+str2同样产生临时对象,但其用来初始化具名对象,所以临时对象的生存周期延长到具名对象的周期
cout << ss.c_str() << endl; //正确输出,说明临时对象仍然存在,并没有销毁,存放字符串的存储正常存在

print(str1 + str2); //把str1+str2产生的临时对象传递给cosnt 引用,临时对象的生命周期延长到const引用的生命周期,所以正常打印
display(str1 + str2); //函数传递具有初始化语义,所以str1+str2产生的临时对象初始化str,生命周期延长,正常打印


return 0;
}

如果不深究,下面这句话可作为总体印象区别
临时对象只在当前行有效
局部对象到函数结束都有效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值