先构造的后析构,后构造的先析构。话不多说,直接上代码。
#include<iostream>
using namespace std;
class A
{
public:
A(){ cout << "constructor A\n"; }
~A(){ cout << "destructor A\n"; }
};
class B
{
public:
B(){ cout << "constructor B\n"; }
~B(){ cout << "destructor B\n"; }
};
class C
{
private:
B b;
A a;
public:
C(){ cout << "constructor C\n"; }
~C(){ cout << "destructor C\n"; }
};
class String
{
private:
char *str;
int len;
public:
void showStr()
{
cout << "string:" << str << ",lenght:" << len << endl;
}
String()
{
str = NULL;
len = 0;
}
String(const char *p)
{
len = strlen(p);
str = new char[len + 1];
strcpy_s(str,len+1, p);
}
~String()
{
if (str != NULL)
delete str;
str = NULL;
cout << "destructor:" << len << endl;/*str指向的空间已经释放了,若输出会有(段错误),故输出len.*/
}
};
class Clock
{
private:
int H;
int M;
int S;
public:
Clock(int h, int m, int s) :H(h), M(m), S(s)
{
cout << "constructor:" << H << ":" << M << ":" << S << endl;
}
~Clock(/*void*/) //析构函数
{
cout << "destructor:" << H << ":" << M << ":" << S << endl;
}
};
Clock C1(1,1,1); //全局对象
Clock C2(2,2,2);
void fun()
{
Clock C5(5, 5, 5);//局部对象
static Clock C6(6, 6, 6);//静态局部对象
}
int main()
{
Clock C3(3, 3, 3);//局部对象
fun();
Clock C4(4, 4, 4);
char s[] = { "I have a book" };
String s1(s);
s1.showStr();
String s2("ABCDE");
s2.showStr();
String *s3 = new String("ahaha!");/*在堆区new一个对象,栈区的s3指向它;堆区的对象又在堆区new一个空间存放"ahaha"*/
s3->showStr();
delete s3;/*释放s3指向空间的瞬间,调用析构函数释放"ahaha"的空间*/
C c;//测试成员对象的构造和析构顺序
return 0;
}
测试结果: