C++里面析构函数与构造函数的调用顺序是相反的,即先构造的后析构,后构造的先析构。
#include <iostream>
#include <cstring>
using namespace std;
class CMyString{
public:
CMyString(char * pData = NULL){
this->m_pData = pData;
cout << "create!" <<endl;}
CMyString(const CMyString &str){
this->flag = str.flag;
this->m_pData = str.m_pData;
cout << "create!" <<endl;
}
~CMyString(void){ cout<< '\t' << flag << " destory!"<<endl; }
const char *flag;
private:
char *m_pData;
public:
CMyString& operator= (const CMyString &str){
cout << "---------------------------------------" <<endl;
if(this != &str){
cout << "opearator=::CMyString ";
CMyString strTemp(str);
strTemp.flag = "operator=::CMyString";
char* pTemp = strTemp.m_pData;
strTemp.m_pData = m_pData;
m_pData = pTemp;
}
cout << "----------------------------------------"<<endl;
return *this;
}
};
int main(){
cout << "str1 " ;
CMyString str1 = "hello world!";
str1.flag = "str1";
cout <<"str2 ";
CMyString str2;
str2.flag = "str2";
str2 = str1;
return 0;
}
结果:
str1 create!
str2 create!
---------------------------------------
opearator=::CMyString create!
operator=::CMyString destory!
----------------------------------------
str2 destory!
str1 destory!
在运算符重载函数中,CMyString的实例strTemp的作用域是if代码块,strTemp实例是一个局部变量。当程序运行到了if语句的strTemp的声明语句时,程序调用拷贝构造函数,strTemp实例被创建。当程序运行到if外面时,此时变量出了作用域,程序调用析构函数,strTemp实例的内存被释放。