前言
本次笔记记录如下知识点
- 1、对象的构造顺序
- 2、局部对象和全局对象的构造和析构
- 3、局部静态对象,对象数组的构造和析构
- 4、临时性对象的详细探讨
对象的构造顺序
class A
{
public:
A()
{
printf("A::A()执行了,this = %p\n", this);
};
virtual ~A() {};
};
class B : public A
{
public:
B()
{
printf("B::B()执行了,this = %p\n", this);
};
virtual ~B() {};
};
class C :public B
{
private:
int m_c;
public:
C():m_c(6)
{
printf("m_c = %d\n", m_c);
printf("C::C()执行了,this = %p\n", this);
}
virtual ~C() {};
};
int main()
{
C c;
return 0;
}
运行结果如下
局部对象和全局对象的构造和析构
局部对象的析构
- 局部对象的析构在任何一个地方的return之后都会调用,所以一般局部对象是现用现定义,尽量把对象定义在需要立即用到它的代码段附近。
- 局部对象的内部的成员变量的值都是随机的。所以尽量在构造函数初始化列表或者构造函数中为成员变量赋初值。
全局对象的构造和析构
- 编译程序时,会发现进入到主函数main之前,这个全局对象就已经生成了
- 全局对象时保存在数据段里面打的,全局变量里面的成员变量一般都是默认值0.
- 全局对象的内存地址是在编译器阶段确定的,所以每次程序执行,这些全局对象的内存地址都是相同的。
局部静态对象,对象数组的构造和析构
局部静态对象的构造和析构
通过如下例子来分析
class A
{
public:
A()
{
printf("A::A()缺省构造函数执行了\n");
};
~A()
{
printf("A::~A()析构构造函数执行了\n");
}
};
void myfunc()
{
static A s_aobj1;
static A s_aobj2;
printf("s_aobj1的地址是 %p\n", &s_aobj1);
printf("s_aobj1的地址是 %p\n", &s_aobj2);
}
int main()
{
myfunc();
myfunc();
return 0;
}
运行结果如下
局部静态对象数组的构造和析构
临时性对象的详细探讨
|