您的位置:首页 > 编程语言 > C语言/C++

C++临时对象

2010-07-08 21:57 302 查看
临时对象的产生:
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重载了赋值运算符.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: