C++临时对象
2010-07-08 21:57
302 查看
临时对象的产生:
1. 用构造函数作为隐式类型转换函数时。
2. 建立一个没有名字的对象时。
直接写下代码 CTempObj();
输出:init obj
exit obj;
不单调用了构造函数,还调用了析构函数.
既然是对象也可以这样使用:CTempObj().Fun();
不过这样使用可要小心了:
(new CTempObj())->Fun();
这个new CTempObj()可不是临时对象,他还没执行析构呢!
3. 函数返回一个对象值时。
再看看一些注意事项:
STL中的一些操作可能要创建临时对象.
例如+ 这个运算符
1. 用构造函数作为隐式类型转换函数时。
class CTempObj { public: char m_szString[10]; char* m_pString; CTempObj(int n) { m_pString=new char[10]; strcpy(m_szString,"string1"); strcpy(m_pString,"string2"); cout<<"init obj with arg"<<endl; } CTempObj() { m_pString=new char[10]; strcpy(m_szString,"string1"); strcpy(m_pString,"string2"); cout<<"init obj"<<endl; } ~CTempObj() { delete m_pString; cout<<"exit obj"<<endl; } void Fun() { cout<<"class fun "<<m_pString<<endl; } }; void ArgFun(CTempObj obj) { } //这里将产生临时对象.它的生命将随着函数的结束而结束 ArgFun(1); 输出:init obj with arg exit obj
2. 建立一个没有名字的对象时。
直接写下代码 CTempObj();
输出:init obj
exit obj;
不单调用了构造函数,还调用了析构函数.
既然是对象也可以这样使用:CTempObj().Fun();
不过这样使用可要小心了:
(new CTempObj())->Fun();
这个new CTempObj()可不是临时对象,他还没执行析构呢!
3. 函数返回一个对象值时。
CTempObj* g_pTest; CTempObj ReturnFun() { //这里故意使用了指针的形式创建,通过结果可以看出,这个临时对象把指针建立的对象给析构了 g_pTest=new CTempObj; return *g_pTest; } //这里将调用析构函数. ReturnFun(); cout<<g_pTest->m_szString<<endl;//存在 cout<<g_pTest->m_pString<<endl; //不存在,析构时销毁. //delete g_pTest; //这里必将出错,因为调用了两次析构,delete m_pString两次.
再看看一些注意事项:
STL中的一些操作可能要创建临时对象.
例如+ 这个运算符
string s1="aaa"; string s2="bbb"; const char *ps=(s1+s2).c_str(); cout<<ps<<endl; //ps 指针地址虽然在,可是内容已经没了. //(s1+s2)产生临时对象,ps=的操作结束后就执行析构函数了. //当然这样可以: string s3==(s1+s2).c_str(); const char *ps=s3.c_str(); cout<<ps<<endl; //因为string重载了赋值运算符.
相关文章推荐
- C++中的临时对象
- C++中的临时对象都是const类型
- C++中函数返回临时对象和本地对象的区别
- 对C++临时对象的内存位置的研究
- C++非const的引用不能指向临时对象
- 关于C++中在函数中按值返回、临时对象、拷贝构造函数的一点理解
- 关于C++中的临时对象问题
- C++中的临时对象
- 从汇编看c++中临时对象的析构时机
- 小问题大思考之C++临时对象
- C++临时对象
- More Effective C++ 条款19 了解临时对象的来源
- C++ 临时对象
- c++中临时对象
- 关于C++中的临时对象问题
- C++调用函数是如何返回临时对象的
- C++以对象作为返回值时编译器的优化,以及临时变量的析构时机
- C++学习笔记之——局部对象和临时对象的构造和析构时机
- c++ 抽象概念,内存格局,浅拷贝,深拷贝,临时对象,无名对象
- C++临时对象